[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-tres-rollup-rules":3,"mdc-qibzm2-key":37,"related-org-anthropic-tres-rollup-rules":3719,"related-repo-anthropic-tres-rollup-rules":3908},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"tres-rollup-rules","create transaction rollup rules in TRES","Analyze an organization's sub-transaction patterns in TRES Finance, identify groups of repetitive transactions, and propose data-driven rollup rules that consolidate them into one aggregated entry per interval (daily or monthly) for cleaner ERP integration. Also lists and deletes rollup rules. Trigger this skill whenever the user asks about rollup rules, transaction aggregation, consolidating transactions, reducing transaction noise, rolling up gas fees, rolling up staking rewards, rolling up micro-transactions, or collapsing many small ledger entries into fewer summary entries. Also trigger on \"create a rollup rule\", \"suggest rollup rules\", \"what should I roll up\", \"show my rollup rules\", \"delete a rollup rule\", \"aggregate transactions\", \"too many transactions\", \"reduce transaction count\", \"roll up fees\", \"daily rollup\", \"monthly rollup\". If a wallet has too many transactions, high-frequency activity, or noisy ledger entries, proactively suggest rollup rules. For computing the EXACT impact of a single already-specified rule or reviewing submitted\u002Fpending rules, use the tres-rollup-review skill instead.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[13,17,20,23],{"name":14,"slug":15,"type":16},"Automation","automation","tag",{"name":18,"slug":19,"type":16},"Finance","finance",{"name":21,"slug":22,"type":16},"Accounting","accounting",{"name":24,"slug":25,"type":16},"Data Cleaning","data-cleaning",294,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community","2026-07-02T07:38:01.531397",null,69,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Community plugin marketplace for Claude Cowork and Claude Code. Read-only mirror — submit plugins at clau.de\u002Fplugin-directory-submission.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Ftree\u002FHEAD\u002Ftres-finance-plugin\u002Fskills\u002Ftres-rollup-rules","---\nname: tres-rollup-rules\ndescription: >\n  Analyze an organization's sub-transaction patterns in TRES Finance, identify groups of\n  repetitive transactions, and propose data-driven rollup rules that consolidate them into\n  one aggregated entry per interval (daily or monthly) for cleaner ERP integration. Also\n  lists and deletes rollup rules. Trigger this skill whenever the user asks about rollup\n  rules, transaction aggregation, consolidating transactions, reducing transaction noise,\n  rolling up gas fees, rolling up staking rewards, rolling up micro-transactions, or\n  collapsing many small ledger entries into fewer summary entries. Also trigger on \"create\n  a rollup rule\", \"suggest rollup rules\", \"what should I roll up\", \"show my rollup rules\",\n  \"delete a rollup rule\", \"aggregate transactions\", \"too many transactions\", \"reduce\n  transaction count\", \"roll up fees\", \"daily rollup\", \"monthly rollup\". If a wallet has too\n  many transactions, high-frequency activity, or noisy ledger entries, proactively suggest\n  rollup rules. For computing the EXACT impact of a single already-specified rule or\n  reviewing submitted\u002Fpending rules, use the tres-rollup-review skill instead.\ncompatibility: \"Requires TRES Finance MCP connector\"\n---\n\n# TRES Finance — Rollup Rules\n\nAnalyze an organization's sub-transaction patterns, identify groups of repetitive\ntransactions, and propose rollup rules that consolidate them into a single entry per\ninterval for cleaner ERP integration. This is a **data-driven discovery** flow — you find\nthe candidates from the data, validate each against real transactions, then present and\ncreate them.\n\nA rollup rule is keyed on FOUR dimensions that together define exactly which\nsub-transactions it claims:\n**internalAccount (wallet) + asset KEY + platform + balanceFactor (direction)**.\nOptional discriminating filters (fees, methodIds, subtxType, amount bounds,\ncounterparties) narrow it further. Everything you discover and propose must map onto this\nshape — see the Rule Field Reference at the bottom.\n\nA rollup is **non-destructive**: the original raw sub-transactions are always preserved\nand visible in the **Rollup Breakdown** report.\n\nAll GraphQL runs through the **TRES Finance MCP connector** (`execute` tool; validate with\n`validate_query` first when unsure). All variable keys and nested input fields MUST use\n**camelCase** (e.g. `internalAccountId`, `balanceFactor`), NEVER snake_case.\n\n---\n\n## Routing\n\n- **\"Suggest \u002F create \u002F propose rollup rules\"**, **\"too many transactions\"**, **\"roll up\n  X\"** → run the full discovery pipeline (Steps 0–6 below). This is the main flow.\n- **\"Show \u002F list my rollup rules\"** → Section A (List existing rules), then stop.\n- **\"Delete a rollup rule\"** → Section C (Delete rules).\n- **\"Review this specific rule\" \u002F \"what would this rule match\"** → hand off to the\n  **tres-rollup-review** skill.\n\n---\n\n## Step 0 — Confirm Scope\n\nEstablish scope with the user, but keep it light — only the analysis is scoped, the rules\nthemselves are usually open-ended.\n\n### Analysis window (OPTIONAL)\nA period only narrows the *discovery* queries so you look at recent, representative\nactivity. It is NOT required, and it is NOT the rule's date range.\n- \"Q1 2025\" → start: `2025-01-01T00:00:00Z`, end: `2025-03-31T23:59:59Z`\n- \"last 3 months\" → compute from today\n\nIf the user gives no period, analyze all history — that is fine and common.\n\n### Rule date range (PREFER OPEN-ENDED)\nThe rules you create should normally have **no start\u002Fend date** — they default to \"from the\nbeginning of time, indefinitely\" so they keep catching matching transactions going\nforward. Only set `startDate`\u002F`endDate` when the user explicitly wants the rule bounded.\n\n### Wallets (optional, default: all)\nThe user may scope to specific wallets.\n\n### Asset classes (optional, default: all non-spam)\nThe user may scope to specific asset classes (e.g. \"just stablecoins\", \"ETH\"). Remember: a\nclass (e.g. USDC) can span many asset keys\u002Fchains, but each rule targets ONE key — see the\nasset-class bridge in Step 2.\n\n### Clustering guidance (optional)\nHints like \"focus on gas fees\", \"ignore staking rewards under $10\", \"group ETH transfers\nby methodId\".\n\n**Confirm scope briefly, then start:**\n> \"I'll look for rollup candidates across **all wallets** and **all assets** (analyzing\n> **all history**). Rules I propose will be open-ended unless you want them date-bounded.\n> Starting now.\"\n\n---\n\n## Step 1 — Inventory\n\nRun these (in parallel where possible).\n\n### 1a. Wallets\n```graphql\nquery Wallets { internalAccount { totalCount results { id name identifier parentPlatform platforms balancesCount status } } }\n```\nCollect wallet `id` (integer) — this is the rule's `internalAccountId`. Use `platforms`\n(plural list) and `parentPlatform` (string); there is no singular `platform` field on\nwallets.\n\n### 1b. Existing rollup rules (so you don't duplicate coverage)\n```graphql\nquery ExistingRules { subTransactionRollupRule { totalCount results { id name interval status startDate endDate createdBy lastSuccessfulRunAt rule } } }\n```\n`rule` is the JSON config (`internal_account_id`, `asset_id`, `platform`, `balance_factor`,\n`fees`, …). Note which (account, assetKey, direction) tuples are already covered by\n**Active** or **Pending** rules — skip those. Ignore **Disabled** rules (they are\nsuperseded versions, not live coverage). Also study the existing rule **names** here to\nlearn the org's naming convention (see Naming below).\n\n### 1c. Total sub-transactions in scope\n```graphql\nquery InScope($ts_Gte: DateTime, $ts_Lte: DateTime) {\n  subTransaction(timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte) { totalCount }\n}\n```\n(Omit the timestamp args entirely when analyzing all history.)\n\nReport: \"Found X wallets, Y existing rules (Z active), N sub-transactions in scope.\"\n\n---\n\n## Step 2 — Discovery (the core analysis)\n\nUse aggregation queries to find which (wallet, asset, direction) groups have the most\nrepetitive volume, then drill into discriminating filters.\n\n### Filter-name reference (verified — use these EXACT names)\n- Wallet: `belongsTo_In: [ID]` (array, even for one id)\n- Asset by key: `asset_In: [ID]` (array of asset KEYS, e.g. `[\"ethereum_native\"]`)\n- Asset class: `asset_AssetClass_In: [ID]`\n- Direction: `balanceFactor: Float` (`-1` = OUTFLOW, `1` = INFLOW)\n- Amount: `amount_Gte` \u002F `amount_Lte`; fiat: `fiatValue_Gte` \u002F `fiatValue_Lte`\n- Counterparty: `sender_Identifier_In: [String]`, `recipient_Identifier_In: [String]`\n- Method: `tx_MethodId: String` (single) or group by `tx__method_id`\n- Sub-tx type: `type: String` \u002F `type_In: [String]` (FinancialAction) — filter with the\n  **lowercase** value (`\"gas\"`, `\"reward\"`, …); note this is the opposite casing from the\n  mutation's UPPERCASE `subtxType` enum. `groupBy: [\"type\"]` works too.\n- Dates: `timestamp_Gte` \u002F `timestamp_Lte`\n- Exclude already-rolled-up sub-txs: `excludeRollups: true`\n- Exclude gas\u002Ffee sub-txs: `excludeGasFees: true`; exclude spam: `excludeSpam: true`\n- Internal transfers only: `internalTransfer: true`\n\n### Always exclude already-rolled-up sub-txs\nAdd `excludeRollups: true` to every discovery\u002Fcount query. It drops ROLLUP \u002F ROLLUP_FEE\nsub-txs so your counts reflect what a *new* rule would actually capture — matching the\nrollup engine's own selection. Without it, groups a prior rule already rolled up would be\ndouble-counted. (`onlyRollup: false` does NOT do this — it's a no-op.) To inspect what an\nexisting rule produced, query `type_In: [\"rollup\", \"rollup_fee\"], typeId: \"\u003Crule_id>\"` —\n`typeId` only means the rollup rule id when paired with a rollup `type`.\n\n### 2a. Group by the rule's real key (wallet id + asset key + platform + direction)\n```graphql\nquery GroupByKey($ts_Gte: DateTime, $ts_Lte: DateTime) {\n  subTransaction(\n    timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte,\n    excludeRollups: true,\n    groupBy: [\"belongs_to\", \"asset\", \"platform\", \"balance_factor\"],\n    aggregations: [\n      { field: id, function: COUNT, alias: \"count\" },\n      { field: fiatValue, function: AVG, alias: \"avgFiat\" }\n    ]\n  ) {\n    groupedAggregations { groupKey results { alias value } }\n  }\n}\n```\n`groupKey` gives you the wallet **id** (→ `internalAccountId`), the asset **key** (→\n`assetId`), platform, and balanceFactor — exactly the four fields a rule needs, no\nname\u002Fsymbol guessing. Groups under ~50 sub-txs are rarely worth a rule.\n\n### The asset-class bridge\nUsers think in asset *classes* (\"roll up all our USDC\"); a rule targets one asset *key*.\nWhen the user scopes by class, you may first group by `asset__asset_class__symbol` to\nprioritize, but you **must** then expand each promising class into its concrete asset keys\n(Step 2a already returns keys) and propose **one rule per (wallet, assetKey, platform,\ndirection)**. In the report, surface the sibling keys on the same wallet so the user sees\nwhich variants each rule does and does not cover.\n\n### 2b. Drill down by methodId (per significant group)\n```graphql\nquery DrillMethod($ts_Gte: DateTime, $ts_Lte: DateTime, $belongsTo_In: [ID], $asset_In: [ID], $balanceFactor: Float) {\n  subTransaction(\n    timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte,\n    belongsTo_In: $belongsTo_In, asset_In: $asset_In, balanceFactor: $balanceFactor,\n    excludeRollups: true,\n    groupBy: [\"tx__method_id\"],\n    aggregations: [\n      { field: id, function: COUNT, alias: \"count\" },\n      { field: amount, function: AVG, alias: \"avgAmount\" },\n      { field: amount, function: MAX, alias: \"maxAmount\" }\n    ]\n  ) {\n    groupedAggregations { groupKey results { alias value } }\n  }\n}\n```\n\n### 2c. Drill down by sub-tx type (optional)\nRepeat the same query shape with `groupBy: [\"type\"]` to see whether a specific sub-tx type\ndominates the group — useful only if you intend a `subtxType` rule.\n\n### Analysis strategy\nReason about which combinations make the best rules:\n1. **Coverage** — each rule should claim a meaningful share of its group.\n2. **Discriminating filter (when useful, not required)** — the four key fields (wallet +\n   assetKey + platform + direction) plus `fees` fully define most rules. Add an optional\n   narrowing filter (methodIds, amount bounds, counterparty, or `subtxType`) only when it\n   sharpens a heterogeneous group — many good rules use none. `subtxType` in particular is\n   optional; don't add it reflexively.\n3. **Interval** — DAY for high-frequency groups (>~500 sub-txs), MONTH otherwise.\n4. **Existing rules** — skip (account, assetKey, direction) tuples already covered by an\n   Active\u002FPending rule. **Never judge an existing rule by its current match count alone**:\n   a rule that has been running has already rolled up its pool, so the live (non-rollup)\n   sub-txs that remain are just the recent unprocessed few — a hard-working rule looks\n   idle. To see what it actually did, count the rollups it produced:\n   `subTransaction(type_In: [\"rollup\",\"rollup_fee\"], typeId: \"\u003Crule_id>\")`. Only treat a\n   rule as ineffective if it has produced ~nothing **and** matches ~nothing now.\n5. **Overlap (soft)** — two rules on the same wallet + assetKey + platform + direction with\n   non-disjoint filters can claim the same sub-txs. This is not fatal: the engine processes\n   rules deterministically by id (PK), so a shared sub-tx is always claimed by the same\n   rule. Prefer non-overlapping rules, but overlap is a note, not a blocker.\n\nFor each candidate, note WHY this combination was chosen.\n\n---\n\n## Step 2.5 — Validate candidates (MANDATORY quality gate)\n\nAt this point you hold your N candidate rule objects (from Step 2) in context. **Invoke the\n`tres-rollup-review` skill** (via the Skill tool) **once** — this loads the review checks\ninto your *own* context (it is not a separate agent and takes no arguments; the candidates\nare already here, nothing is passed). Then, following those instructions, walk your\ncandidates **one at a time** — for each candidate run the review's Check 1 (one\n`subTransactionRollupRulePreview` call), Check 2, and Check 3 — and record a per-candidate\nverdict: PASS \u002F DROP \u002F FIX, with the exact sub-tx and parent-tx counts. So 10 candidates →\n10 preview calls → 10 verdicts.\n\nAct on the results:\n- **DROP** any candidate that matches **0 sub-txs** (the rule would do nothing).\n- **FIX** config problems (inverted dates, min>max, identifier-on-wrong-direction,\n  mutually-exclusive prefixes, bad cutoffTime).\n- **Note** any overlap with another candidate or an Active\u002FPending rule in the report —\n  overlap is informational (the engine resolves it deterministically by id), so only adjust\n  if the user prefers cleaner separation; do not drop on overlap alone.\n\nCandidates that DROP or have unresolved FIXes don't proceed to Step 3. This gate is what\nkeeps suggestion quality high — do not skip it.\n\n---\n\n## Naming rollup rules\n\nEvery proposed rule needs a clear, consistent `name`. Decide it like this:\n\n1. **Match the org's existing convention first.** From the Active\u002FPending rule names you\n   fetched in Step 1b, infer the org's pattern — separator, field order, casing, how they\n   denote direction\u002Ffees\u002Finterval — and name new rules the same way so they sit naturally\n   alongside the existing ones.\n2. **If there's no clear existing pattern, default to:**\n   `\u003Cwallet name> - \u003Casset symbol> - \u003Cdirection> \u003Cfees label>` and append ` (\u003Cinterval>)`,\n   where the fees label maps:\n   - `fees: ONLY` → `fees` (e.g. \"gas fees\")\n   - `fees: INCLUDE` → `include fees`\n   - `fees: EXCLUDE` → `exclude fees`\n   Example: `EVM Exec Wallet 1 - ETH - outflow fees (monthly)`. When a single\n   discriminating filter defines the rule (e.g. a known method), fold it into the name\n   (e.g. `… - LP exits (daily)`).\n\nKeep names human-readable and unique within the proposal set. Use the same name in the HTML\nreport, the proposal table, and the `name` field of the create mutation.\n\n---\n\n## Step 3 — Present Results\n\n### 3a. HTML proposal report\nWrite a standalone `.html` file to the working directory (e.g.\n`rollup-rules-proposal.html`) and tell the user the path so they can open it. Use the\ntemplate and patterns in `references\u002Fproposal-html-template.html` **verbatim** — copy the\nCSS and skeleton as-is, only replacing the `\u003C!-- PLACEHOLDER -->` comments with actual data\nrows. Do NOT regenerate the CSS or layout. That reference file documents the summary cards,\nthe proposed-rules table, the skipped table, the per-candidate **\"Preview matched txs\"**\nledger link, the impact badges, and the hash\u002Faddress display rule. **Keep the HTML compact**\n(target under 4000 tokens of body).\n\nKey content rules from that reference, called out here because they matter:\n- The Volume column is **always** `Volume (sub-tx \u002F tx)` and values are **always** prefixed\n  with `~` (e.g. `~1,240 \u002F ~310`) — the values are the rollup_review-validated sub-tx and\n  distinct parent-tx counts, and `~` sets the expectation that the Preview link's ledger\n  filters can't express every rule filter exactly.\n- Impact badges: **high volume is a GOOD result, never an alarm** — green HIGH \u002F indigo\n  MEDIUM \u002F grey LOW. Red is reserved for actual problems (the 🟢\u002F🟡\u002F🔴 validation status),\n  never for impact.\n- Skipped table: include candidates the rollup_review gate dropped (e.g. \"0 matching\n  sub-txs\", \"overlaps rule #38211\").\n\n### 3b. Proposal task table\nPresent a **numbered markdown table** in chat — one row per proposed rule — so the user can\napprove by number. Columns: `#`, Rule Name, Wallet (id), Asset \u002F Platform, Direction,\nFilter, Volume (sub-tx \u002F tx), Interval, Validated Impact. Priority hint: HIGH for >1000\nsub-txs, MEDIUM for 200–1000, LOW for \u003C200.\n\n---\n\n## Step 4 — User Review\n\nAsk the user:\n> \"I've proposed X rollup rules (all validated against real transactions). Review the\n> report and table above. You can:\"\n> - **Approve all** — I'll create all proposed rules\n> - **Approve specific rules** — tell me which numbers\n> - **Provide feedback** — tell me what to adjust and I'll re-analyze\n> - **Cancel** — no rules will be created\n\nWait for the user's response before proceeding. **Never create a rule without explicit\nconfirmation.**\n\n---\n\n## Step 5 — Create Rules\n\nFor approved rules, run the `createSubTransactionRollupRules` mutation via the MCP `execute`\ntool (it accepts a batch and returns per-rule results with validation issues):\n\n```graphql\nmutation CreateRollupRules($rules: [RollupRuleCreationRequest]!) {\n  createSubTransactionRollupRules(rules: $rules) {\n    results {\n      rollupRuleId\n      validationIssues { blocking type message }\n    }\n  }\n}\n```\n\nEach entry in `$rules` (all camelCase):\n```json\n{\n  \"name\": \"ETH outflow gas — wallet-1 (daily)\",\n  \"interval\": \"DAY\",\n  \"createdBy\": \"AI\",\n  \"rule\": {\n    \"internalAccountId\": 123,\n    \"assetId\": \"ethereum_native\",\n    \"platform\": \"ETHEREUM\",\n    \"balanceFactor\": \"OUTFLOW\",\n    \"fees\": \"ONLY\",\n    \"methodIds\": [\"0x573ade81\"]\n  }\n}\n```\n\n- **Always set `createdBy: \"AI\"`** so the rule is attributed to AI in the audit trail.\n- **Omit `startDate` \u002F `endDate`** unless the user wants the rule bounded — omitting them\n  makes the rule open-ended.\n- **Only include optional filter fields the user\u002Fanalysis actually set** — do NOT send\n  `null` for unused optional fields, just omit them from the `rule` object.\n- Prefer **creating new rules**. Editing an existing PENDING rule (via top-level\n  `ruleId: \u003Cid>`) is supported, but pending rules may be auto-approved after a delay, so an\n  in-place edit can race with activation — only edit pending when the user explicitly asks.\n\n**Enum values (GraphQL enums, NOT quoted strings, in the query):**\n- `interval`: `DAY` or `MONTH`\n- `platform`: UPPERCASE — `ETHEREUM`, `BASE`, `SOLANA`, `BITCOIN`, …\n- `balanceFactor`: `INFLOW` (incoming, +1) or `OUTFLOW` (outgoing, -1)\n- `fees`: `INCLUDE` (txs + their fees), `EXCLUDE` (txs without fees), `ONLY` (only the fee\n  sub-txs — selects GAS **and** FEE). For a gas\u002Ffee rollup use `fees: ONLY` **by itself**;\n  do NOT also set `subtxType: GAS\u002FFEE` — `ONLY` already covers them, and adding\n  `subtxType: GAS` is redundant and wrongly drops the FEE sub-txs.\n- `subtxType`: a `FinancialAction` enum or null — e.g. `REWARD`, `NATIVE_TRANSFER`,\n  `TOKEN_TRANSFER`. Leave null for gas\u002Ffee rollups (use `fees: ONLY` instead).\n- `createdBy`: `AI`\n\n**Platform casing:** lowercase in query *filters* (`subTransaction(asset_In: [...])`,\n`asset(platform: \"ethereum\")`); UPPERCASE enum in *mutation* inputs (`rule.platform:\nETHEREUM`). Query return values are UPPERCASE too.\n\n**Validation rules the server enforces (never propose a rule that breaks these):**\n- `senderIdentifier` is only valid on **INFLOW** rules; `recipientIdentifier` only on\n  **OUTFLOW** rules (on an outflow the sender is always your wallet, and vice versa).\n- `senderIdentifier` ⊥ `originalSenderPrefix`; `recipientIdentifier` ⊥\n  `originalRecipientPrefix` (mutually exclusive).\n- `startDate` must be before `endDate`.\n- An identical rule (same `rule` JSON) cannot already exist for the org.\n\nThe mutation also re-checks matching transactions and overlaps and returns those as\n`validationIssues` — the rollup_review gate should have caught them already, but the server\nis the final authority.\n\n### Resolving `assetId` and `internalAccountId`\n- `internalAccountId` (integer): from the Step 1 wallet inventory.\n- `assetId` is the asset **key** = `\"\u003Cplatform_lowercase>_\u003Cidentifier>\"`. Native tokens:\n  `ethereum_native`, `base_native`, `solana_native`. ERC-20:\n  `ethereum_0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48` (USDC). Step 2a already returns keys\n  in the groupKey; otherwise look them up:\n```graphql\nquery AssetKeys { asset(key_In: [\"ethereum_native\"]) { results { key identifier platform symbol name parentPlatform } } }\n```\n\n---\n\n## Step 6 — Report Outcomes\n\nFor each per-rule result in the batch response, color-code the outcome so the user sees\nstatus at a glance — **🟢 green** = created with no issues, **🟡 yellow** = created with\nnon-blocking validation issues, **🔴 red** = blocked \u002F not created:\n- `rollupRuleId` present, no `validationIssues` → 🟢 created\n- `rollupRuleId` present with only non-blocking `validationIssues` → 🟡 created, issue noted\n- any `validationIssues` with `blocking: true` (no `rollupRuleId`) → 🔴 FAILED, quote the\n  `message`\n\nCreated rules start in `PENDING` status and activate on the next processing cycle. Use the\nsame 🟢\u002F🟡\u002F🔴 coding in the Step 3 report when surfacing the rollup_review validation\noutcome per proposed rule.\n\n---\n\n## A. List existing rollup rules\n\nWhen the user just wants to see current rules:\n\n```graphql\nquery ListRollupRules($limit: Int, $offset: Int, $status_In: [String]) {\n  subTransactionRollupRule(limit: $limit, offset: $offset, status_In: $status_In) {\n    totalCount\n    results { id name interval startDate endDate nextActivationDate status rule }\n  }\n}\n```\nVariables: `{\"limit\": 50, \"offset\": 0}` (add `status_In: [\"Active\"]` etc. to filter;\nstatus is title-case). Present as a numbered markdown table: Name, ID, Status, Interval,\nDate range (or \"indefinite\"), and the key rule filters (wallet, asset, direction, fees, any\noptional filter). Paginate if `totalCount > 50`.\n\n---\n\n## C. Delete rollup rules\n\nOnly **PENDING** rules can be deleted via the API. Active rules require TRES support.\n\nFirst list the rules (Section A) so the user can identify which to delete, then confirm the\nrule ID(s) before deleting.\n\n```graphql\nmutation DeleteRollupRules($ruleIds: [Int]!) {\n  deleteSubTransactionRollupRules(ruleIds: $ruleIds) {\n    results { deletedIds failures { ruleId reason } }\n  }\n}\n```\nReport `deletedIds` (succeeded) and `failures` (with reasons — typically the rule is\nalready active).\n\n---\n\n## Rule Field Reference (RollupRule)\n\n**Required:** `internalAccountId` (int), `assetId` (asset key), `platform` (enum),\n`balanceFactor` (INFLOW\u002FOUTFLOW), `fees` (INCLUDE\u002FEXCLUDE\u002FONLY).\n\n**Optional (have safe defaults — only set when needed):** `senderIdentifier`,\n`recipientIdentifier`, `originalSenderPrefix`, `originalRecipientPrefix`, `methodIds`\n(list), `maxAmount`, `minAmount`, `excludeFiat` (default false), `excludeInternal` (default\nfalse), `subtxType` (FinancialAction), `bufferInDays` (default 0; days to wait for\nlate-arriving txs), `cutoffTime` (\"HH:MM\"), `rollupInternalTransfersOnly` (default false;\nwhen true, only internal transfers are rolled up and the rollup is paired with its inflow —\nthe system also sets `mergeWithInflowTx` and `runInternalTransferClassificationOnRollups`).\n\n**Top-level request fields:** `name` (required), `interval` (required), `rule` (required),\n`startDate` (optional), `endDate` (optional), `ruleId` (optional — edit a pending rule),\n`createdBy` (set `AI`).\n\n**FinancialAction enum values (for `subtxType`):** TRACE_TRANSFER, TOKEN_TRANSFER,\nNATIVE_TRANSFER, DELEGATION, UNDELEGATION, VEST, UNVEST, VALIDATOR_CREATION, REWARD,\nCOMMISSION, GAS, FEE, EXCHANGE_WITHDRAWAL, EXCHANGE_DEPOSIT, EXCHANGE_TRANSFER,\nEXCHANGE_BUY, EXCHANGE_SELL, EXCHANGE_LOAN, EXCHANGE_SETTLEMENT, REBATE, FIAT_TRANSFER,\nBURNED, ROLLUP, ROLLUP_FEE, PLUG, GROUP, FUNDING, INTEREST, TRANSFER_DELEGATION_REWARD,\nREEVALUATION, PAYMENT, BANK_DEPOSIT, BANK_WITHDRAWAL, MINING_REWARD.\n\n---\n\n## Rules\n\n- **KEEP CONTEXT SMALL** — use aggregations, never fetch full result sets.\n- **Run discovery queries in parallel** where possible.\n- **ALWAYS run the Step 2.5 rollup_review gate** before presenting.\n- **ALWAYS produce both the HTML report AND the proposal table** after analysis.\n- **Explain your reasoning** for each proposed rule.\n- **Always confirm before creating** — present the full proposal and wait for explicit\n  approval before calling the create mutation.\n- **Provide a brief conversational summary** after presenting the report.\n- **Incorporate user clustering guidance** when choosing dimensions.\n\n---\n\n## Limitations — not available via MCP\n\n1. **Editing active rules** — there is no edit for an active rule; recreate (PENDING rules\n   can be edited via `ruleId`, or deleted and recreated).\n2. **Activating\u002Fdeactivating rules** — managed by the backend processing pipeline, not\n   directly controllable via API.\n3. **Viewing rollup breakdown** — the detailed breakdown of which raw transactions were\n   aggregated is in the Rollup Breakdown report in the TRES dashboard.\n4. **Active rule deletion** — only PENDING rules can be deleted via the API; direct the\n   user to TRES support for active rules.\n",{"data":38,"body":40},{"name":4,"description":6,"compatibility":39},"Requires TRES Finance MCP connector",{"type":41,"children":42},"root",[43,52,66,78,97,149,153,160,224,227,233,238,245,258,285,290,296,324,330,335,341,346,352,357,365,395,398,404,409,415,436,480,486,500,575,581,614,619,624,627,633,638,644,908,914,965,971,1091,1130,1136,1176,1182,1301,1307,1326,1332,1337,1434,1439,1442,1448,1496,1501,1541,1546,1549,1555,1568,1676,1688,1691,1697,1703,1761,1766,1833,1839,1859,1862,1868,1873,1924,1934,1937,1943,1963,2032,2045,2435,2520,2528,2750,2796,2804,2899,2912,2929,2995,3009,3012,3018,3044,3115,3128,3131,3137,3142,3195,3223,3226,3232,3243,3248,3293,3314,3317,3323,3367,3482,3545,3562,3565,3571,3654,3657,3663,3713],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"tres-finance-rollup-rules",[49],{"type":50,"value":51},"text","TRES Finance — Rollup Rules",{"type":44,"tag":53,"props":54,"children":55},"p",{},[56,58,64],{"type":50,"value":57},"Analyze an organization's sub-transaction patterns, identify groups of repetitive\ntransactions, and propose rollup rules that consolidate them into a single entry per\ninterval for cleaner ERP integration. This is a ",{"type":44,"tag":59,"props":60,"children":61},"strong",{},[62],{"type":50,"value":63},"data-driven discovery",{"type":50,"value":65}," flow — you find\nthe candidates from the data, validate each against real transactions, then present and\ncreate them.",{"type":44,"tag":53,"props":67,"children":68},{},[69,71,76],{"type":50,"value":70},"A rollup rule is keyed on FOUR dimensions that together define exactly which\nsub-transactions it claims:\n",{"type":44,"tag":59,"props":72,"children":73},{},[74],{"type":50,"value":75},"internalAccount (wallet) + asset KEY + platform + balanceFactor (direction)",{"type":50,"value":77},".\nOptional discriminating filters (fees, methodIds, subtxType, amount bounds,\ncounterparties) narrow it further. Everything you discover and propose must map onto this\nshape — see the Rule Field Reference at the bottom.",{"type":44,"tag":53,"props":79,"children":80},{},[81,83,88,90,95],{"type":50,"value":82},"A rollup is ",{"type":44,"tag":59,"props":84,"children":85},{},[86],{"type":50,"value":87},"non-destructive",{"type":50,"value":89},": the original raw sub-transactions are always preserved\nand visible in the ",{"type":44,"tag":59,"props":91,"children":92},{},[93],{"type":50,"value":94},"Rollup Breakdown",{"type":50,"value":96}," report.",{"type":44,"tag":53,"props":98,"children":99},{},[100,102,107,109,116,118,124,126,131,133,139,141,147],{"type":50,"value":101},"All GraphQL runs through the ",{"type":44,"tag":59,"props":103,"children":104},{},[105],{"type":50,"value":106},"TRES Finance MCP connector",{"type":50,"value":108}," (",{"type":44,"tag":110,"props":111,"children":113},"code",{"className":112},[],[114],{"type":50,"value":115},"execute",{"type":50,"value":117}," tool; validate with\n",{"type":44,"tag":110,"props":119,"children":121},{"className":120},[],[122],{"type":50,"value":123},"validate_query",{"type":50,"value":125}," first when unsure). All variable keys and nested input fields MUST use\n",{"type":44,"tag":59,"props":127,"children":128},{},[129],{"type":50,"value":130},"camelCase",{"type":50,"value":132}," (e.g. ",{"type":44,"tag":110,"props":134,"children":136},{"className":135},[],[137],{"type":50,"value":138},"internalAccountId",{"type":50,"value":140},", ",{"type":44,"tag":110,"props":142,"children":144},{"className":143},[],[145],{"type":50,"value":146},"balanceFactor",{"type":50,"value":148},"), NEVER snake_case.",{"type":44,"tag":150,"props":151,"children":152},"hr",{},[],{"type":44,"tag":154,"props":155,"children":157},"h2",{"id":156},"routing",[158],{"type":50,"value":159},"Routing",{"type":44,"tag":161,"props":162,"children":163},"ul",{},[164,187,197,207],{"type":44,"tag":165,"props":166,"children":167},"li",{},[168,173,174,179,180,185],{"type":44,"tag":59,"props":169,"children":170},{},[171],{"type":50,"value":172},"\"Suggest \u002F create \u002F propose rollup rules\"",{"type":50,"value":140},{"type":44,"tag":59,"props":175,"children":176},{},[177],{"type":50,"value":178},"\"too many transactions\"",{"type":50,"value":140},{"type":44,"tag":59,"props":181,"children":182},{},[183],{"type":50,"value":184},"\"roll up\nX\"",{"type":50,"value":186}," → run the full discovery pipeline (Steps 0–6 below). This is the main flow.",{"type":44,"tag":165,"props":188,"children":189},{},[190,195],{"type":44,"tag":59,"props":191,"children":192},{},[193],{"type":50,"value":194},"\"Show \u002F list my rollup rules\"",{"type":50,"value":196}," → Section A (List existing rules), then stop.",{"type":44,"tag":165,"props":198,"children":199},{},[200,205],{"type":44,"tag":59,"props":201,"children":202},{},[203],{"type":50,"value":204},"\"Delete a rollup rule\"",{"type":50,"value":206}," → Section C (Delete rules).",{"type":44,"tag":165,"props":208,"children":209},{},[210,215,217,222],{"type":44,"tag":59,"props":211,"children":212},{},[213],{"type":50,"value":214},"\"Review this specific rule\" \u002F \"what would this rule match\"",{"type":50,"value":216}," → hand off to the\n",{"type":44,"tag":59,"props":218,"children":219},{},[220],{"type":50,"value":221},"tres-rollup-review",{"type":50,"value":223}," skill.",{"type":44,"tag":150,"props":225,"children":226},{},[],{"type":44,"tag":154,"props":228,"children":230},{"id":229},"step-0-confirm-scope",[231],{"type":50,"value":232},"Step 0 — Confirm Scope",{"type":44,"tag":53,"props":234,"children":235},{},[236],{"type":50,"value":237},"Establish scope with the user, but keep it light — only the analysis is scoped, the rules\nthemselves are usually open-ended.",{"type":44,"tag":239,"props":240,"children":242},"h3",{"id":241},"analysis-window-optional",[243],{"type":50,"value":244},"Analysis window (OPTIONAL)",{"type":44,"tag":53,"props":246,"children":247},{},[248,250,256],{"type":50,"value":249},"A period only narrows the ",{"type":44,"tag":251,"props":252,"children":253},"em",{},[254],{"type":50,"value":255},"discovery",{"type":50,"value":257}," queries so you look at recent, representative\nactivity. It is NOT required, and it is NOT the rule's date range.",{"type":44,"tag":161,"props":259,"children":260},{},[261,280],{"type":44,"tag":165,"props":262,"children":263},{},[264,266,272,274],{"type":50,"value":265},"\"Q1 2025\" → start: ",{"type":44,"tag":110,"props":267,"children":269},{"className":268},[],[270],{"type":50,"value":271},"2025-01-01T00:00:00Z",{"type":50,"value":273},", end: ",{"type":44,"tag":110,"props":275,"children":277},{"className":276},[],[278],{"type":50,"value":279},"2025-03-31T23:59:59Z",{"type":44,"tag":165,"props":281,"children":282},{},[283],{"type":50,"value":284},"\"last 3 months\" → compute from today",{"type":44,"tag":53,"props":286,"children":287},{},[288],{"type":50,"value":289},"If the user gives no period, analyze all history — that is fine and common.",{"type":44,"tag":239,"props":291,"children":293},{"id":292},"rule-date-range-prefer-open-ended",[294],{"type":50,"value":295},"Rule date range (PREFER OPEN-ENDED)",{"type":44,"tag":53,"props":297,"children":298},{},[299,301,306,308,314,316,322],{"type":50,"value":300},"The rules you create should normally have ",{"type":44,"tag":59,"props":302,"children":303},{},[304],{"type":50,"value":305},"no start\u002Fend date",{"type":50,"value":307}," — they default to \"from the\nbeginning of time, indefinitely\" so they keep catching matching transactions going\nforward. Only set ",{"type":44,"tag":110,"props":309,"children":311},{"className":310},[],[312],{"type":50,"value":313},"startDate",{"type":50,"value":315},"\u002F",{"type":44,"tag":110,"props":317,"children":319},{"className":318},[],[320],{"type":50,"value":321},"endDate",{"type":50,"value":323}," when the user explicitly wants the rule bounded.",{"type":44,"tag":239,"props":325,"children":327},{"id":326},"wallets-optional-default-all",[328],{"type":50,"value":329},"Wallets (optional, default: all)",{"type":44,"tag":53,"props":331,"children":332},{},[333],{"type":50,"value":334},"The user may scope to specific wallets.",{"type":44,"tag":239,"props":336,"children":338},{"id":337},"asset-classes-optional-default-all-non-spam",[339],{"type":50,"value":340},"Asset classes (optional, default: all non-spam)",{"type":44,"tag":53,"props":342,"children":343},{},[344],{"type":50,"value":345},"The user may scope to specific asset classes (e.g. \"just stablecoins\", \"ETH\"). Remember: a\nclass (e.g. USDC) can span many asset keys\u002Fchains, but each rule targets ONE key — see the\nasset-class bridge in Step 2.",{"type":44,"tag":239,"props":347,"children":349},{"id":348},"clustering-guidance-optional",[350],{"type":50,"value":351},"Clustering guidance (optional)",{"type":44,"tag":53,"props":353,"children":354},{},[355],{"type":50,"value":356},"Hints like \"focus on gas fees\", \"ignore staking rewards under $10\", \"group ETH transfers\nby methodId\".",{"type":44,"tag":53,"props":358,"children":359},{},[360],{"type":44,"tag":59,"props":361,"children":362},{},[363],{"type":50,"value":364},"Confirm scope briefly, then start:",{"type":44,"tag":366,"props":367,"children":368},"blockquote",{},[369],{"type":44,"tag":53,"props":370,"children":371},{},[372,374,379,381,386,388,393],{"type":50,"value":373},"\"I'll look for rollup candidates across ",{"type":44,"tag":59,"props":375,"children":376},{},[377],{"type":50,"value":378},"all wallets",{"type":50,"value":380}," and ",{"type":44,"tag":59,"props":382,"children":383},{},[384],{"type":50,"value":385},"all assets",{"type":50,"value":387}," (analyzing\n",{"type":44,"tag":59,"props":389,"children":390},{},[391],{"type":50,"value":392},"all history",{"type":50,"value":394},"). Rules I propose will be open-ended unless you want them date-bounded.\nStarting now.\"",{"type":44,"tag":150,"props":396,"children":397},{},[],{"type":44,"tag":154,"props":399,"children":401},{"id":400},"step-1-inventory",[402],{"type":50,"value":403},"Step 1 — Inventory",{"type":44,"tag":53,"props":405,"children":406},{},[407],{"type":50,"value":408},"Run these (in parallel where possible).",{"type":44,"tag":239,"props":410,"children":412},{"id":411},"_1a-wallets",[413],{"type":50,"value":414},"1a. Wallets",{"type":44,"tag":416,"props":417,"children":422},"pre",{"className":418,"code":419,"language":420,"meta":421,"style":421},"language-graphql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","query Wallets { internalAccount { totalCount results { id name identifier parentPlatform platforms balancesCount status } } }\n","graphql","",[423],{"type":44,"tag":110,"props":424,"children":425},{"__ignoreMap":421},[426],{"type":44,"tag":427,"props":428,"children":431},"span",{"class":429,"line":430},"line",1,[432],{"type":44,"tag":427,"props":433,"children":434},{},[435],{"type":50,"value":419},{"type":44,"tag":53,"props":437,"children":438},{},[439,441,447,449,454,456,462,464,470,472,478],{"type":50,"value":440},"Collect wallet ",{"type":44,"tag":110,"props":442,"children":444},{"className":443},[],[445],{"type":50,"value":446},"id",{"type":50,"value":448}," (integer) — this is the rule's ",{"type":44,"tag":110,"props":450,"children":452},{"className":451},[],[453],{"type":50,"value":138},{"type":50,"value":455},". Use ",{"type":44,"tag":110,"props":457,"children":459},{"className":458},[],[460],{"type":50,"value":461},"platforms",{"type":50,"value":463},"\n(plural list) and ",{"type":44,"tag":110,"props":465,"children":467},{"className":466},[],[468],{"type":50,"value":469},"parentPlatform",{"type":50,"value":471}," (string); there is no singular ",{"type":44,"tag":110,"props":473,"children":475},{"className":474},[],[476],{"type":50,"value":477},"platform",{"type":50,"value":479}," field on\nwallets.",{"type":44,"tag":239,"props":481,"children":483},{"id":482},"_1b-existing-rollup-rules-so-you-dont-duplicate-coverage",[484],{"type":50,"value":485},"1b. Existing rollup rules (so you don't duplicate coverage)",{"type":44,"tag":416,"props":487,"children":489},{"className":418,"code":488,"language":420,"meta":421,"style":421},"query ExistingRules { subTransactionRollupRule { totalCount results { id name interval status startDate endDate createdBy lastSuccessfulRunAt rule } } }\n",[490],{"type":44,"tag":110,"props":491,"children":492},{"__ignoreMap":421},[493],{"type":44,"tag":427,"props":494,"children":495},{"class":429,"line":430},[496],{"type":44,"tag":427,"props":497,"children":498},{},[499],{"type":50,"value":488},{"type":44,"tag":53,"props":501,"children":502},{},[503,509,511,517,518,524,525,530,531,537,539,545,547,552,554,559,561,566,568,573],{"type":44,"tag":110,"props":504,"children":506},{"className":505},[],[507],{"type":50,"value":508},"rule",{"type":50,"value":510}," is the JSON config (",{"type":44,"tag":110,"props":512,"children":514},{"className":513},[],[515],{"type":50,"value":516},"internal_account_id",{"type":50,"value":140},{"type":44,"tag":110,"props":519,"children":521},{"className":520},[],[522],{"type":50,"value":523},"asset_id",{"type":50,"value":140},{"type":44,"tag":110,"props":526,"children":528},{"className":527},[],[529],{"type":50,"value":477},{"type":50,"value":140},{"type":44,"tag":110,"props":532,"children":534},{"className":533},[],[535],{"type":50,"value":536},"balance_factor",{"type":50,"value":538},",\n",{"type":44,"tag":110,"props":540,"children":542},{"className":541},[],[543],{"type":50,"value":544},"fees",{"type":50,"value":546},", …). Note which (account, assetKey, direction) tuples are already covered by\n",{"type":44,"tag":59,"props":548,"children":549},{},[550],{"type":50,"value":551},"Active",{"type":50,"value":553}," or ",{"type":44,"tag":59,"props":555,"children":556},{},[557],{"type":50,"value":558},"Pending",{"type":50,"value":560}," rules — skip those. Ignore ",{"type":44,"tag":59,"props":562,"children":563},{},[564],{"type":50,"value":565},"Disabled",{"type":50,"value":567}," rules (they are\nsuperseded versions, not live coverage). Also study the existing rule ",{"type":44,"tag":59,"props":569,"children":570},{},[571],{"type":50,"value":572},"names",{"type":50,"value":574}," here to\nlearn the org's naming convention (see Naming below).",{"type":44,"tag":239,"props":576,"children":578},{"id":577},"_1c-total-sub-transactions-in-scope",[579],{"type":50,"value":580},"1c. Total sub-transactions in scope",{"type":44,"tag":416,"props":582,"children":584},{"className":418,"code":583,"language":420,"meta":421,"style":421},"query InScope($ts_Gte: DateTime, $ts_Lte: DateTime) {\n  subTransaction(timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte) { totalCount }\n}\n",[585],{"type":44,"tag":110,"props":586,"children":587},{"__ignoreMap":421},[588,596,605],{"type":44,"tag":427,"props":589,"children":590},{"class":429,"line":430},[591],{"type":44,"tag":427,"props":592,"children":593},{},[594],{"type":50,"value":595},"query InScope($ts_Gte: DateTime, $ts_Lte: DateTime) {\n",{"type":44,"tag":427,"props":597,"children":599},{"class":429,"line":598},2,[600],{"type":44,"tag":427,"props":601,"children":602},{},[603],{"type":50,"value":604},"  subTransaction(timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte) { totalCount }\n",{"type":44,"tag":427,"props":606,"children":608},{"class":429,"line":607},3,[609],{"type":44,"tag":427,"props":610,"children":611},{},[612],{"type":50,"value":613},"}\n",{"type":44,"tag":53,"props":615,"children":616},{},[617],{"type":50,"value":618},"(Omit the timestamp args entirely when analyzing all history.)",{"type":44,"tag":53,"props":620,"children":621},{},[622],{"type":50,"value":623},"Report: \"Found X wallets, Y existing rules (Z active), N sub-transactions in scope.\"",{"type":44,"tag":150,"props":625,"children":626},{},[],{"type":44,"tag":154,"props":628,"children":630},{"id":629},"step-2-discovery-the-core-analysis",[631],{"type":50,"value":632},"Step 2 — Discovery (the core analysis)",{"type":44,"tag":53,"props":634,"children":635},{},[636],{"type":50,"value":637},"Use aggregation queries to find which (wallet, asset, direction) groups have the most\nrepetitive volume, then drill into discriminating filters.",{"type":44,"tag":239,"props":639,"children":641},{"id":640},"filter-name-reference-verified-use-these-exact-names",[642],{"type":50,"value":643},"Filter-name reference (verified — use these EXACT names)",{"type":44,"tag":161,"props":645,"children":646},{},[647,660,681,692,720,754,772,791,849,867,878,897],{"type":44,"tag":165,"props":648,"children":649},{},[650,652,658],{"type":50,"value":651},"Wallet: ",{"type":44,"tag":110,"props":653,"children":655},{"className":654},[],[656],{"type":50,"value":657},"belongsTo_In: [ID]",{"type":50,"value":659}," (array, even for one id)",{"type":44,"tag":165,"props":661,"children":662},{},[663,665,671,673,679],{"type":50,"value":664},"Asset by key: ",{"type":44,"tag":110,"props":666,"children":668},{"className":667},[],[669],{"type":50,"value":670},"asset_In: [ID]",{"type":50,"value":672}," (array of asset KEYS, e.g. ",{"type":44,"tag":110,"props":674,"children":676},{"className":675},[],[677],{"type":50,"value":678},"[\"ethereum_native\"]",{"type":50,"value":680},")",{"type":44,"tag":165,"props":682,"children":683},{},[684,686],{"type":50,"value":685},"Asset class: ",{"type":44,"tag":110,"props":687,"children":689},{"className":688},[],[690],{"type":50,"value":691},"asset_AssetClass_In: [ID]",{"type":44,"tag":165,"props":693,"children":694},{},[695,697,703,704,710,712,718],{"type":50,"value":696},"Direction: ",{"type":44,"tag":110,"props":698,"children":700},{"className":699},[],[701],{"type":50,"value":702},"balanceFactor: Float",{"type":50,"value":108},{"type":44,"tag":110,"props":705,"children":707},{"className":706},[],[708],{"type":50,"value":709},"-1",{"type":50,"value":711}," = OUTFLOW, ",{"type":44,"tag":110,"props":713,"children":715},{"className":714},[],[716],{"type":50,"value":717},"1",{"type":50,"value":719}," = INFLOW)",{"type":44,"tag":165,"props":721,"children":722},{},[723,725,731,733,739,741,747,748],{"type":50,"value":724},"Amount: ",{"type":44,"tag":110,"props":726,"children":728},{"className":727},[],[729],{"type":50,"value":730},"amount_Gte",{"type":50,"value":732}," \u002F ",{"type":44,"tag":110,"props":734,"children":736},{"className":735},[],[737],{"type":50,"value":738},"amount_Lte",{"type":50,"value":740},"; fiat: ",{"type":44,"tag":110,"props":742,"children":744},{"className":743},[],[745],{"type":50,"value":746},"fiatValue_Gte",{"type":50,"value":732},{"type":44,"tag":110,"props":749,"children":751},{"className":750},[],[752],{"type":50,"value":753},"fiatValue_Lte",{"type":44,"tag":165,"props":755,"children":756},{},[757,759,765,766],{"type":50,"value":758},"Counterparty: ",{"type":44,"tag":110,"props":760,"children":762},{"className":761},[],[763],{"type":50,"value":764},"sender_Identifier_In: [String]",{"type":50,"value":140},{"type":44,"tag":110,"props":767,"children":769},{"className":768},[],[770],{"type":50,"value":771},"recipient_Identifier_In: [String]",{"type":44,"tag":165,"props":773,"children":774},{},[775,777,783,785],{"type":50,"value":776},"Method: ",{"type":44,"tag":110,"props":778,"children":780},{"className":779},[],[781],{"type":50,"value":782},"tx_MethodId: String",{"type":50,"value":784}," (single) or group by ",{"type":44,"tag":110,"props":786,"children":788},{"className":787},[],[789],{"type":50,"value":790},"tx__method_id",{"type":44,"tag":165,"props":792,"children":793},{},[794,796,802,803,809,811,816,818,824,825,831,833,839,841,847],{"type":50,"value":795},"Sub-tx type: ",{"type":44,"tag":110,"props":797,"children":799},{"className":798},[],[800],{"type":50,"value":801},"type: String",{"type":50,"value":732},{"type":44,"tag":110,"props":804,"children":806},{"className":805},[],[807],{"type":50,"value":808},"type_In: [String]",{"type":50,"value":810}," (FinancialAction) — filter with the\n",{"type":44,"tag":59,"props":812,"children":813},{},[814],{"type":50,"value":815},"lowercase",{"type":50,"value":817}," value (",{"type":44,"tag":110,"props":819,"children":821},{"className":820},[],[822],{"type":50,"value":823},"\"gas\"",{"type":50,"value":140},{"type":44,"tag":110,"props":826,"children":828},{"className":827},[],[829],{"type":50,"value":830},"\"reward\"",{"type":50,"value":832},", …); note this is the opposite casing from the\nmutation's UPPERCASE ",{"type":44,"tag":110,"props":834,"children":836},{"className":835},[],[837],{"type":50,"value":838},"subtxType",{"type":50,"value":840}," enum. ",{"type":44,"tag":110,"props":842,"children":844},{"className":843},[],[845],{"type":50,"value":846},"groupBy: [\"type\"]",{"type":50,"value":848}," works too.",{"type":44,"tag":165,"props":850,"children":851},{},[852,854,860,861],{"type":50,"value":853},"Dates: ",{"type":44,"tag":110,"props":855,"children":857},{"className":856},[],[858],{"type":50,"value":859},"timestamp_Gte",{"type":50,"value":732},{"type":44,"tag":110,"props":862,"children":864},{"className":863},[],[865],{"type":50,"value":866},"timestamp_Lte",{"type":44,"tag":165,"props":868,"children":869},{},[870,872],{"type":50,"value":871},"Exclude already-rolled-up sub-txs: ",{"type":44,"tag":110,"props":873,"children":875},{"className":874},[],[876],{"type":50,"value":877},"excludeRollups: true",{"type":44,"tag":165,"props":879,"children":880},{},[881,883,889,891],{"type":50,"value":882},"Exclude gas\u002Ffee sub-txs: ",{"type":44,"tag":110,"props":884,"children":886},{"className":885},[],[887],{"type":50,"value":888},"excludeGasFees: true",{"type":50,"value":890},"; exclude spam: ",{"type":44,"tag":110,"props":892,"children":894},{"className":893},[],[895],{"type":50,"value":896},"excludeSpam: true",{"type":44,"tag":165,"props":898,"children":899},{},[900,902],{"type":50,"value":901},"Internal transfers only: ",{"type":44,"tag":110,"props":903,"children":905},{"className":904},[],[906],{"type":50,"value":907},"internalTransfer: true",{"type":44,"tag":239,"props":909,"children":911},{"id":910},"always-exclude-already-rolled-up-sub-txs",[912],{"type":50,"value":913},"Always exclude already-rolled-up sub-txs",{"type":44,"tag":53,"props":915,"children":916},{},[917,919,924,926,931,933,939,941,947,949,955,957,963],{"type":50,"value":918},"Add ",{"type":44,"tag":110,"props":920,"children":922},{"className":921},[],[923],{"type":50,"value":877},{"type":50,"value":925}," to every discovery\u002Fcount query. It drops ROLLUP \u002F ROLLUP_FEE\nsub-txs so your counts reflect what a ",{"type":44,"tag":251,"props":927,"children":928},{},[929],{"type":50,"value":930},"new",{"type":50,"value":932}," rule would actually capture — matching the\nrollup engine's own selection. Without it, groups a prior rule already rolled up would be\ndouble-counted. (",{"type":44,"tag":110,"props":934,"children":936},{"className":935},[],[937],{"type":50,"value":938},"onlyRollup: false",{"type":50,"value":940}," does NOT do this — it's a no-op.) To inspect what an\nexisting rule produced, query ",{"type":44,"tag":110,"props":942,"children":944},{"className":943},[],[945],{"type":50,"value":946},"type_In: [\"rollup\", \"rollup_fee\"], typeId: \"\u003Crule_id>\"",{"type":50,"value":948}," —\n",{"type":44,"tag":110,"props":950,"children":952},{"className":951},[],[953],{"type":50,"value":954},"typeId",{"type":50,"value":956}," only means the rollup rule id when paired with a rollup ",{"type":44,"tag":110,"props":958,"children":960},{"className":959},[],[961],{"type":50,"value":962},"type",{"type":50,"value":964},".",{"type":44,"tag":239,"props":966,"children":968},{"id":967},"_2a-group-by-the-rules-real-key-wallet-id-asset-key-platform-direction",[969],{"type":50,"value":970},"2a. Group by the rule's real key (wallet id + asset key + platform + direction)",{"type":44,"tag":416,"props":972,"children":974},{"className":418,"code":973,"language":420,"meta":421,"style":421},"query GroupByKey($ts_Gte: DateTime, $ts_Lte: DateTime) {\n  subTransaction(\n    timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte,\n    excludeRollups: true,\n    groupBy: [\"belongs_to\", \"asset\", \"platform\", \"balance_factor\"],\n    aggregations: [\n      { field: id, function: COUNT, alias: \"count\" },\n      { field: fiatValue, function: AVG, alias: \"avgFiat\" }\n    ]\n  ) {\n    groupedAggregations { groupKey results { alias value } }\n  }\n}\n",[975],{"type":44,"tag":110,"props":976,"children":977},{"__ignoreMap":421},[978,986,994,1002,1011,1020,1029,1038,1047,1056,1065,1074,1083],{"type":44,"tag":427,"props":979,"children":980},{"class":429,"line":430},[981],{"type":44,"tag":427,"props":982,"children":983},{},[984],{"type":50,"value":985},"query GroupByKey($ts_Gte: DateTime, $ts_Lte: DateTime) {\n",{"type":44,"tag":427,"props":987,"children":988},{"class":429,"line":598},[989],{"type":44,"tag":427,"props":990,"children":991},{},[992],{"type":50,"value":993},"  subTransaction(\n",{"type":44,"tag":427,"props":995,"children":996},{"class":429,"line":607},[997],{"type":44,"tag":427,"props":998,"children":999},{},[1000],{"type":50,"value":1001},"    timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte,\n",{"type":44,"tag":427,"props":1003,"children":1005},{"class":429,"line":1004},4,[1006],{"type":44,"tag":427,"props":1007,"children":1008},{},[1009],{"type":50,"value":1010},"    excludeRollups: true,\n",{"type":44,"tag":427,"props":1012,"children":1014},{"class":429,"line":1013},5,[1015],{"type":44,"tag":427,"props":1016,"children":1017},{},[1018],{"type":50,"value":1019},"    groupBy: [\"belongs_to\", \"asset\", \"platform\", \"balance_factor\"],\n",{"type":44,"tag":427,"props":1021,"children":1023},{"class":429,"line":1022},6,[1024],{"type":44,"tag":427,"props":1025,"children":1026},{},[1027],{"type":50,"value":1028},"    aggregations: [\n",{"type":44,"tag":427,"props":1030,"children":1032},{"class":429,"line":1031},7,[1033],{"type":44,"tag":427,"props":1034,"children":1035},{},[1036],{"type":50,"value":1037},"      { field: id, function: COUNT, alias: \"count\" },\n",{"type":44,"tag":427,"props":1039,"children":1041},{"class":429,"line":1040},8,[1042],{"type":44,"tag":427,"props":1043,"children":1044},{},[1045],{"type":50,"value":1046},"      { field: fiatValue, function: AVG, alias: \"avgFiat\" }\n",{"type":44,"tag":427,"props":1048,"children":1050},{"class":429,"line":1049},9,[1051],{"type":44,"tag":427,"props":1052,"children":1053},{},[1054],{"type":50,"value":1055},"    ]\n",{"type":44,"tag":427,"props":1057,"children":1059},{"class":429,"line":1058},10,[1060],{"type":44,"tag":427,"props":1061,"children":1062},{},[1063],{"type":50,"value":1064},"  ) {\n",{"type":44,"tag":427,"props":1066,"children":1068},{"class":429,"line":1067},11,[1069],{"type":44,"tag":427,"props":1070,"children":1071},{},[1072],{"type":50,"value":1073},"    groupedAggregations { groupKey results { alias value } }\n",{"type":44,"tag":427,"props":1075,"children":1077},{"class":429,"line":1076},12,[1078],{"type":44,"tag":427,"props":1079,"children":1080},{},[1081],{"type":50,"value":1082},"  }\n",{"type":44,"tag":427,"props":1084,"children":1086},{"class":429,"line":1085},13,[1087],{"type":44,"tag":427,"props":1088,"children":1089},{},[1090],{"type":50,"value":613},{"type":44,"tag":53,"props":1092,"children":1093},{},[1094,1100,1102,1106,1108,1113,1115,1120,1122,1128],{"type":44,"tag":110,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":50,"value":1099},"groupKey",{"type":50,"value":1101}," gives you the wallet ",{"type":44,"tag":59,"props":1103,"children":1104},{},[1105],{"type":50,"value":446},{"type":50,"value":1107}," (→ ",{"type":44,"tag":110,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":50,"value":138},{"type":50,"value":1114},"), the asset ",{"type":44,"tag":59,"props":1116,"children":1117},{},[1118],{"type":50,"value":1119},"key",{"type":50,"value":1121}," (→\n",{"type":44,"tag":110,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":50,"value":1127},"assetId",{"type":50,"value":1129},"), platform, and balanceFactor — exactly the four fields a rule needs, no\nname\u002Fsymbol guessing. Groups under ~50 sub-txs are rarely worth a rule.",{"type":44,"tag":239,"props":1131,"children":1133},{"id":1132},"the-asset-class-bridge",[1134],{"type":50,"value":1135},"The asset-class bridge",{"type":44,"tag":53,"props":1137,"children":1138},{},[1139,1141,1146,1148,1152,1154,1160,1162,1167,1169,1174],{"type":50,"value":1140},"Users think in asset ",{"type":44,"tag":251,"props":1142,"children":1143},{},[1144],{"type":50,"value":1145},"classes",{"type":50,"value":1147}," (\"roll up all our USDC\"); a rule targets one asset ",{"type":44,"tag":251,"props":1149,"children":1150},{},[1151],{"type":50,"value":1119},{"type":50,"value":1153},".\nWhen the user scopes by class, you may first group by ",{"type":44,"tag":110,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":50,"value":1159},"asset__asset_class__symbol",{"type":50,"value":1161}," to\nprioritize, but you ",{"type":44,"tag":59,"props":1163,"children":1164},{},[1165],{"type":50,"value":1166},"must",{"type":50,"value":1168}," then expand each promising class into its concrete asset keys\n(Step 2a already returns keys) and propose ",{"type":44,"tag":59,"props":1170,"children":1171},{},[1172],{"type":50,"value":1173},"one rule per (wallet, assetKey, platform,\ndirection)",{"type":50,"value":1175},". In the report, surface the sibling keys on the same wallet so the user sees\nwhich variants each rule does and does not cover.",{"type":44,"tag":239,"props":1177,"children":1179},{"id":1178},"_2b-drill-down-by-methodid-per-significant-group",[1180],{"type":50,"value":1181},"2b. Drill down by methodId (per significant group)",{"type":44,"tag":416,"props":1183,"children":1185},{"className":418,"code":1184,"language":420,"meta":421,"style":421},"query DrillMethod($ts_Gte: DateTime, $ts_Lte: DateTime, $belongsTo_In: [ID], $asset_In: [ID], $balanceFactor: Float) {\n  subTransaction(\n    timestamp_Gte: $ts_Gte, timestamp_Lte: $ts_Lte,\n    belongsTo_In: $belongsTo_In, asset_In: $asset_In, balanceFactor: $balanceFactor,\n    excludeRollups: true,\n    groupBy: [\"tx__method_id\"],\n    aggregations: [\n      { field: id, function: COUNT, alias: \"count\" },\n      { field: amount, function: AVG, alias: \"avgAmount\" },\n      { field: amount, function: MAX, alias: \"maxAmount\" }\n    ]\n  ) {\n    groupedAggregations { groupKey results { alias value } }\n  }\n}\n",[1186],{"type":44,"tag":110,"props":1187,"children":1188},{"__ignoreMap":421},[1189,1197,1204,1211,1219,1226,1234,1241,1248,1256,1264,1271,1278,1285,1293],{"type":44,"tag":427,"props":1190,"children":1191},{"class":429,"line":430},[1192],{"type":44,"tag":427,"props":1193,"children":1194},{},[1195],{"type":50,"value":1196},"query DrillMethod($ts_Gte: DateTime, $ts_Lte: DateTime, $belongsTo_In: [ID], $asset_In: [ID], $balanceFactor: Float) {\n",{"type":44,"tag":427,"props":1198,"children":1199},{"class":429,"line":598},[1200],{"type":44,"tag":427,"props":1201,"children":1202},{},[1203],{"type":50,"value":993},{"type":44,"tag":427,"props":1205,"children":1206},{"class":429,"line":607},[1207],{"type":44,"tag":427,"props":1208,"children":1209},{},[1210],{"type":50,"value":1001},{"type":44,"tag":427,"props":1212,"children":1213},{"class":429,"line":1004},[1214],{"type":44,"tag":427,"props":1215,"children":1216},{},[1217],{"type":50,"value":1218},"    belongsTo_In: $belongsTo_In, asset_In: $asset_In, balanceFactor: $balanceFactor,\n",{"type":44,"tag":427,"props":1220,"children":1221},{"class":429,"line":1013},[1222],{"type":44,"tag":427,"props":1223,"children":1224},{},[1225],{"type":50,"value":1010},{"type":44,"tag":427,"props":1227,"children":1228},{"class":429,"line":1022},[1229],{"type":44,"tag":427,"props":1230,"children":1231},{},[1232],{"type":50,"value":1233},"    groupBy: [\"tx__method_id\"],\n",{"type":44,"tag":427,"props":1235,"children":1236},{"class":429,"line":1031},[1237],{"type":44,"tag":427,"props":1238,"children":1239},{},[1240],{"type":50,"value":1028},{"type":44,"tag":427,"props":1242,"children":1243},{"class":429,"line":1040},[1244],{"type":44,"tag":427,"props":1245,"children":1246},{},[1247],{"type":50,"value":1037},{"type":44,"tag":427,"props":1249,"children":1250},{"class":429,"line":1049},[1251],{"type":44,"tag":427,"props":1252,"children":1253},{},[1254],{"type":50,"value":1255},"      { field: amount, function: AVG, alias: \"avgAmount\" },\n",{"type":44,"tag":427,"props":1257,"children":1258},{"class":429,"line":1058},[1259],{"type":44,"tag":427,"props":1260,"children":1261},{},[1262],{"type":50,"value":1263},"      { field: amount, function: MAX, alias: \"maxAmount\" }\n",{"type":44,"tag":427,"props":1265,"children":1266},{"class":429,"line":1067},[1267],{"type":44,"tag":427,"props":1268,"children":1269},{},[1270],{"type":50,"value":1055},{"type":44,"tag":427,"props":1272,"children":1273},{"class":429,"line":1076},[1274],{"type":44,"tag":427,"props":1275,"children":1276},{},[1277],{"type":50,"value":1064},{"type":44,"tag":427,"props":1279,"children":1280},{"class":429,"line":1085},[1281],{"type":44,"tag":427,"props":1282,"children":1283},{},[1284],{"type":50,"value":1073},{"type":44,"tag":427,"props":1286,"children":1288},{"class":429,"line":1287},14,[1289],{"type":44,"tag":427,"props":1290,"children":1291},{},[1292],{"type":50,"value":1082},{"type":44,"tag":427,"props":1294,"children":1296},{"class":429,"line":1295},15,[1297],{"type":44,"tag":427,"props":1298,"children":1299},{},[1300],{"type":50,"value":613},{"type":44,"tag":239,"props":1302,"children":1304},{"id":1303},"_2c-drill-down-by-sub-tx-type-optional",[1305],{"type":50,"value":1306},"2c. Drill down by sub-tx type (optional)",{"type":44,"tag":53,"props":1308,"children":1309},{},[1310,1312,1317,1319,1324],{"type":50,"value":1311},"Repeat the same query shape with ",{"type":44,"tag":110,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":50,"value":846},{"type":50,"value":1318}," to see whether a specific sub-tx type\ndominates the group — useful only if you intend a ",{"type":44,"tag":110,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":50,"value":838},{"type":50,"value":1325}," rule.",{"type":44,"tag":239,"props":1327,"children":1329},{"id":1328},"analysis-strategy",[1330],{"type":50,"value":1331},"Analysis strategy",{"type":44,"tag":53,"props":1333,"children":1334},{},[1335],{"type":50,"value":1336},"Reason about which combinations make the best rules:",{"type":44,"tag":1338,"props":1339,"children":1340},"ol",{},[1341,1351,1382,1392,1424],{"type":44,"tag":165,"props":1342,"children":1343},{},[1344,1349],{"type":44,"tag":59,"props":1345,"children":1346},{},[1347],{"type":50,"value":1348},"Coverage",{"type":50,"value":1350}," — each rule should claim a meaningful share of its group.",{"type":44,"tag":165,"props":1352,"children":1353},{},[1354,1359,1361,1366,1368,1373,1375,1380],{"type":44,"tag":59,"props":1355,"children":1356},{},[1357],{"type":50,"value":1358},"Discriminating filter (when useful, not required)",{"type":50,"value":1360}," — the four key fields (wallet +\nassetKey + platform + direction) plus ",{"type":44,"tag":110,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":50,"value":544},{"type":50,"value":1367}," fully define most rules. Add an optional\nnarrowing filter (methodIds, amount bounds, counterparty, or ",{"type":44,"tag":110,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":50,"value":838},{"type":50,"value":1374},") only when it\nsharpens a heterogeneous group — many good rules use none. ",{"type":44,"tag":110,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":50,"value":838},{"type":50,"value":1381}," in particular is\noptional; don't add it reflexively.",{"type":44,"tag":165,"props":1383,"children":1384},{},[1385,1390],{"type":44,"tag":59,"props":1386,"children":1387},{},[1388],{"type":50,"value":1389},"Interval",{"type":50,"value":1391}," — DAY for high-frequency groups (>~500 sub-txs), MONTH otherwise.",{"type":44,"tag":165,"props":1393,"children":1394},{},[1395,1400,1402,1407,1409,1415,1417,1422],{"type":44,"tag":59,"props":1396,"children":1397},{},[1398],{"type":50,"value":1399},"Existing rules",{"type":50,"value":1401}," — skip (account, assetKey, direction) tuples already covered by an\nActive\u002FPending rule. ",{"type":44,"tag":59,"props":1403,"children":1404},{},[1405],{"type":50,"value":1406},"Never judge an existing rule by its current match count alone",{"type":50,"value":1408},":\na rule that has been running has already rolled up its pool, so the live (non-rollup)\nsub-txs that remain are just the recent unprocessed few — a hard-working rule looks\nidle. To see what it actually did, count the rollups it produced:\n",{"type":44,"tag":110,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":50,"value":1414},"subTransaction(type_In: [\"rollup\",\"rollup_fee\"], typeId: \"\u003Crule_id>\")",{"type":50,"value":1416},". Only treat a\nrule as ineffective if it has produced ~nothing ",{"type":44,"tag":59,"props":1418,"children":1419},{},[1420],{"type":50,"value":1421},"and",{"type":50,"value":1423}," matches ~nothing now.",{"type":44,"tag":165,"props":1425,"children":1426},{},[1427,1432],{"type":44,"tag":59,"props":1428,"children":1429},{},[1430],{"type":50,"value":1431},"Overlap (soft)",{"type":50,"value":1433}," — two rules on the same wallet + assetKey + platform + direction with\nnon-disjoint filters can claim the same sub-txs. This is not fatal: the engine processes\nrules deterministically by id (PK), so a shared sub-tx is always claimed by the same\nrule. Prefer non-overlapping rules, but overlap is a note, not a blocker.",{"type":44,"tag":53,"props":1435,"children":1436},{},[1437],{"type":50,"value":1438},"For each candidate, note WHY this combination was chosen.",{"type":44,"tag":150,"props":1440,"children":1441},{},[],{"type":44,"tag":154,"props":1443,"children":1445},{"id":1444},"step-25-validate-candidates-mandatory-quality-gate",[1446],{"type":50,"value":1447},"Step 2.5 — Validate candidates (MANDATORY quality gate)",{"type":44,"tag":53,"props":1449,"children":1450},{},[1451,1453,1465,1467,1472,1474,1479,1481,1486,1488,1494],{"type":50,"value":1452},"At this point you hold your N candidate rule objects (from Step 2) in context. ",{"type":44,"tag":59,"props":1454,"children":1455},{},[1456,1458,1463],{"type":50,"value":1457},"Invoke the\n",{"type":44,"tag":110,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":50,"value":221},{"type":50,"value":1464}," skill",{"type":50,"value":1466}," (via the Skill tool) ",{"type":44,"tag":59,"props":1468,"children":1469},{},[1470],{"type":50,"value":1471},"once",{"type":50,"value":1473}," — this loads the review checks\ninto your ",{"type":44,"tag":251,"props":1475,"children":1476},{},[1477],{"type":50,"value":1478},"own",{"type":50,"value":1480}," context (it is not a separate agent and takes no arguments; the candidates\nare already here, nothing is passed). Then, following those instructions, walk your\ncandidates ",{"type":44,"tag":59,"props":1482,"children":1483},{},[1484],{"type":50,"value":1485},"one at a time",{"type":50,"value":1487}," — for each candidate run the review's Check 1 (one\n",{"type":44,"tag":110,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":50,"value":1493},"subTransactionRollupRulePreview",{"type":50,"value":1495}," call), Check 2, and Check 3 — and record a per-candidate\nverdict: PASS \u002F DROP \u002F FIX, with the exact sub-tx and parent-tx counts. So 10 candidates →\n10 preview calls → 10 verdicts.",{"type":44,"tag":53,"props":1497,"children":1498},{},[1499],{"type":50,"value":1500},"Act on the results:",{"type":44,"tag":161,"props":1502,"children":1503},{},[1504,1521,1531],{"type":44,"tag":165,"props":1505,"children":1506},{},[1507,1512,1514,1519],{"type":44,"tag":59,"props":1508,"children":1509},{},[1510],{"type":50,"value":1511},"DROP",{"type":50,"value":1513}," any candidate that matches ",{"type":44,"tag":59,"props":1515,"children":1516},{},[1517],{"type":50,"value":1518},"0 sub-txs",{"type":50,"value":1520}," (the rule would do nothing).",{"type":44,"tag":165,"props":1522,"children":1523},{},[1524,1529],{"type":44,"tag":59,"props":1525,"children":1526},{},[1527],{"type":50,"value":1528},"FIX",{"type":50,"value":1530}," config problems (inverted dates, min>max, identifier-on-wrong-direction,\nmutually-exclusive prefixes, bad cutoffTime).",{"type":44,"tag":165,"props":1532,"children":1533},{},[1534,1539],{"type":44,"tag":59,"props":1535,"children":1536},{},[1537],{"type":50,"value":1538},"Note",{"type":50,"value":1540}," any overlap with another candidate or an Active\u002FPending rule in the report —\noverlap is informational (the engine resolves it deterministically by id), so only adjust\nif the user prefers cleaner separation; do not drop on overlap alone.",{"type":44,"tag":53,"props":1542,"children":1543},{},[1544],{"type":50,"value":1545},"Candidates that DROP or have unresolved FIXes don't proceed to Step 3. This gate is what\nkeeps suggestion quality high — do not skip it.",{"type":44,"tag":150,"props":1547,"children":1548},{},[],{"type":44,"tag":154,"props":1550,"children":1552},{"id":1551},"naming-rollup-rules",[1553],{"type":50,"value":1554},"Naming rollup rules",{"type":44,"tag":53,"props":1556,"children":1557},{},[1558,1560,1566],{"type":50,"value":1559},"Every proposed rule needs a clear, consistent ",{"type":44,"tag":110,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":50,"value":1565},"name",{"type":50,"value":1567},". Decide it like this:",{"type":44,"tag":1338,"props":1569,"children":1570},{},[1571,1581],{"type":44,"tag":165,"props":1572,"children":1573},{},[1574,1579],{"type":44,"tag":59,"props":1575,"children":1576},{},[1577],{"type":50,"value":1578},"Match the org's existing convention first.",{"type":50,"value":1580}," From the Active\u002FPending rule names you\nfetched in Step 1b, infer the org's pattern — separator, field order, casing, how they\ndenote direction\u002Ffees\u002Finterval — and name new rules the same way so they sit naturally\nalongside the existing ones.",{"type":44,"tag":165,"props":1582,"children":1583},{},[1584,1589,1595,1597,1603,1605],{"type":44,"tag":59,"props":1585,"children":1586},{},[1587],{"type":50,"value":1588},"If there's no clear existing pattern, default to:",{"type":44,"tag":110,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":50,"value":1594},"\u003Cwallet name> - \u003Casset symbol> - \u003Cdirection> \u003Cfees label>",{"type":50,"value":1596}," and append ",{"type":44,"tag":110,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":50,"value":1602}," (\u003Cinterval>)",{"type":50,"value":1604},",\nwhere the fees label maps:\n",{"type":44,"tag":161,"props":1606,"children":1607},{},[1608,1626,1642],{"type":44,"tag":165,"props":1609,"children":1610},{},[1611,1617,1619,1624],{"type":44,"tag":110,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":50,"value":1616},"fees: ONLY",{"type":50,"value":1618}," → ",{"type":44,"tag":110,"props":1620,"children":1622},{"className":1621},[],[1623],{"type":50,"value":544},{"type":50,"value":1625}," (e.g. \"gas fees\")",{"type":44,"tag":165,"props":1627,"children":1628},{},[1629,1635,1636],{"type":44,"tag":110,"props":1630,"children":1632},{"className":1631},[],[1633],{"type":50,"value":1634},"fees: INCLUDE",{"type":50,"value":1618},{"type":44,"tag":110,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":50,"value":1641},"include fees",{"type":44,"tag":165,"props":1643,"children":1644},{},[1645,1651,1652,1658,1660,1666,1668,1674],{"type":44,"tag":110,"props":1646,"children":1648},{"className":1647},[],[1649],{"type":50,"value":1650},"fees: EXCLUDE",{"type":50,"value":1618},{"type":44,"tag":110,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":50,"value":1657},"exclude fees",{"type":50,"value":1659},"\nExample: ",{"type":44,"tag":110,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":50,"value":1665},"EVM Exec Wallet 1 - ETH - outflow fees (monthly)",{"type":50,"value":1667},". When a single\ndiscriminating filter defines the rule (e.g. a known method), fold it into the name\n(e.g. ",{"type":44,"tag":110,"props":1669,"children":1671},{"className":1670},[],[1672],{"type":50,"value":1673},"… - LP exits (daily)",{"type":50,"value":1675},").",{"type":44,"tag":53,"props":1677,"children":1678},{},[1679,1681,1686],{"type":50,"value":1680},"Keep names human-readable and unique within the proposal set. Use the same name in the HTML\nreport, the proposal table, and the ",{"type":44,"tag":110,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":50,"value":1565},{"type":50,"value":1687}," field of the create mutation.",{"type":44,"tag":150,"props":1689,"children":1690},{},[],{"type":44,"tag":154,"props":1692,"children":1694},{"id":1693},"step-3-present-results",[1695],{"type":50,"value":1696},"Step 3 — Present Results",{"type":44,"tag":239,"props":1698,"children":1700},{"id":1699},"_3a-html-proposal-report",[1701],{"type":50,"value":1702},"3a. HTML proposal report",{"type":44,"tag":53,"props":1704,"children":1705},{},[1706,1708,1714,1716,1722,1724,1730,1732,1737,1739,1745,1747,1752,1754,1759],{"type":50,"value":1707},"Write a standalone ",{"type":44,"tag":110,"props":1709,"children":1711},{"className":1710},[],[1712],{"type":50,"value":1713},".html",{"type":50,"value":1715}," file to the working directory (e.g.\n",{"type":44,"tag":110,"props":1717,"children":1719},{"className":1718},[],[1720],{"type":50,"value":1721},"rollup-rules-proposal.html",{"type":50,"value":1723},") and tell the user the path so they can open it. Use the\ntemplate and patterns in ",{"type":44,"tag":110,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":50,"value":1729},"references\u002Fproposal-html-template.html",{"type":50,"value":1731}," ",{"type":44,"tag":59,"props":1733,"children":1734},{},[1735],{"type":50,"value":1736},"verbatim",{"type":50,"value":1738}," — copy the\nCSS and skeleton as-is, only replacing the ",{"type":44,"tag":110,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":50,"value":1744},"\u003C!-- PLACEHOLDER -->",{"type":50,"value":1746}," comments with actual data\nrows. Do NOT regenerate the CSS or layout. That reference file documents the summary cards,\nthe proposed-rules table, the skipped table, the per-candidate ",{"type":44,"tag":59,"props":1748,"children":1749},{},[1750],{"type":50,"value":1751},"\"Preview matched txs\"",{"type":50,"value":1753},"\nledger link, the impact badges, and the hash\u002Faddress display rule. ",{"type":44,"tag":59,"props":1755,"children":1756},{},[1757],{"type":50,"value":1758},"Keep the HTML compact",{"type":50,"value":1760},"\n(target under 4000 tokens of body).",{"type":44,"tag":53,"props":1762,"children":1763},{},[1764],{"type":50,"value":1765},"Key content rules from that reference, called out here because they matter:",{"type":44,"tag":161,"props":1767,"children":1768},{},[1769,1816,1828],{"type":44,"tag":165,"props":1770,"children":1771},{},[1772,1774,1779,1780,1786,1788,1792,1794,1800,1801,1807,1809,1814],{"type":50,"value":1773},"The Volume column is ",{"type":44,"tag":59,"props":1775,"children":1776},{},[1777],{"type":50,"value":1778},"always",{"type":50,"value":1731},{"type":44,"tag":110,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":50,"value":1785},"Volume (sub-tx \u002F tx)",{"type":50,"value":1787}," and values are ",{"type":44,"tag":59,"props":1789,"children":1790},{},[1791],{"type":50,"value":1778},{"type":50,"value":1793}," prefixed\nwith ",{"type":44,"tag":110,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":50,"value":1799},"~",{"type":50,"value":132},{"type":44,"tag":110,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":50,"value":1806},"~1,240 \u002F ~310",{"type":50,"value":1808},") — the values are the rollup_review-validated sub-tx and\ndistinct parent-tx counts, and ",{"type":44,"tag":110,"props":1810,"children":1812},{"className":1811},[],[1813],{"type":50,"value":1799},{"type":50,"value":1815}," sets the expectation that the Preview link's ledger\nfilters can't express every rule filter exactly.",{"type":44,"tag":165,"props":1817,"children":1818},{},[1819,1821,1826],{"type":50,"value":1820},"Impact badges: ",{"type":44,"tag":59,"props":1822,"children":1823},{},[1824],{"type":50,"value":1825},"high volume is a GOOD result, never an alarm",{"type":50,"value":1827}," — green HIGH \u002F indigo\nMEDIUM \u002F grey LOW. Red is reserved for actual problems (the 🟢\u002F🟡\u002F🔴 validation status),\nnever for impact.",{"type":44,"tag":165,"props":1829,"children":1830},{},[1831],{"type":50,"value":1832},"Skipped table: include candidates the rollup_review gate dropped (e.g. \"0 matching\nsub-txs\", \"overlaps rule #38211\").",{"type":44,"tag":239,"props":1834,"children":1836},{"id":1835},"_3b-proposal-task-table",[1837],{"type":50,"value":1838},"3b. Proposal task table",{"type":44,"tag":53,"props":1840,"children":1841},{},[1842,1844,1849,1851,1857],{"type":50,"value":1843},"Present a ",{"type":44,"tag":59,"props":1845,"children":1846},{},[1847],{"type":50,"value":1848},"numbered markdown table",{"type":50,"value":1850}," in chat — one row per proposed rule — so the user can\napprove by number. Columns: ",{"type":44,"tag":110,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":50,"value":1856},"#",{"type":50,"value":1858},", Rule Name, Wallet (id), Asset \u002F Platform, Direction,\nFilter, Volume (sub-tx \u002F tx), Interval, Validated Impact. Priority hint: HIGH for >1000\nsub-txs, MEDIUM for 200–1000, LOW for \u003C200.",{"type":44,"tag":150,"props":1860,"children":1861},{},[],{"type":44,"tag":154,"props":1863,"children":1865},{"id":1864},"step-4-user-review",[1866],{"type":50,"value":1867},"Step 4 — User Review",{"type":44,"tag":53,"props":1869,"children":1870},{},[1871],{"type":50,"value":1872},"Ask the user:",{"type":44,"tag":366,"props":1874,"children":1875},{},[1876,1881],{"type":44,"tag":53,"props":1877,"children":1878},{},[1879],{"type":50,"value":1880},"\"I've proposed X rollup rules (all validated against real transactions). Review the\nreport and table above. You can:\"",{"type":44,"tag":161,"props":1882,"children":1883},{},[1884,1894,1904,1914],{"type":44,"tag":165,"props":1885,"children":1886},{},[1887,1892],{"type":44,"tag":59,"props":1888,"children":1889},{},[1890],{"type":50,"value":1891},"Approve all",{"type":50,"value":1893}," — I'll create all proposed rules",{"type":44,"tag":165,"props":1895,"children":1896},{},[1897,1902],{"type":44,"tag":59,"props":1898,"children":1899},{},[1900],{"type":50,"value":1901},"Approve specific rules",{"type":50,"value":1903}," — tell me which numbers",{"type":44,"tag":165,"props":1905,"children":1906},{},[1907,1912],{"type":44,"tag":59,"props":1908,"children":1909},{},[1910],{"type":50,"value":1911},"Provide feedback",{"type":50,"value":1913}," — tell me what to adjust and I'll re-analyze",{"type":44,"tag":165,"props":1915,"children":1916},{},[1917,1922],{"type":44,"tag":59,"props":1918,"children":1919},{},[1920],{"type":50,"value":1921},"Cancel",{"type":50,"value":1923}," — no rules will be created",{"type":44,"tag":53,"props":1925,"children":1926},{},[1927,1929],{"type":50,"value":1928},"Wait for the user's response before proceeding. ",{"type":44,"tag":59,"props":1930,"children":1931},{},[1932],{"type":50,"value":1933},"Never create a rule without explicit\nconfirmation.",{"type":44,"tag":150,"props":1935,"children":1936},{},[],{"type":44,"tag":154,"props":1938,"children":1940},{"id":1939},"step-5-create-rules",[1941],{"type":50,"value":1942},"Step 5 — Create Rules",{"type":44,"tag":53,"props":1944,"children":1945},{},[1946,1948,1954,1956,1961],{"type":50,"value":1947},"For approved rules, run the ",{"type":44,"tag":110,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":50,"value":1953},"createSubTransactionRollupRules",{"type":50,"value":1955}," mutation via the MCP ",{"type":44,"tag":110,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":50,"value":115},{"type":50,"value":1962},"\ntool (it accepts a batch and returns per-rule results with validation issues):",{"type":44,"tag":416,"props":1964,"children":1966},{"className":418,"code":1965,"language":420,"meta":421,"style":421},"mutation CreateRollupRules($rules: [RollupRuleCreationRequest]!) {\n  createSubTransactionRollupRules(rules: $rules) {\n    results {\n      rollupRuleId\n      validationIssues { blocking type message }\n    }\n  }\n}\n",[1967],{"type":44,"tag":110,"props":1968,"children":1969},{"__ignoreMap":421},[1970,1978,1986,1994,2002,2010,2018,2025],{"type":44,"tag":427,"props":1971,"children":1972},{"class":429,"line":430},[1973],{"type":44,"tag":427,"props":1974,"children":1975},{},[1976],{"type":50,"value":1977},"mutation CreateRollupRules($rules: [RollupRuleCreationRequest]!) {\n",{"type":44,"tag":427,"props":1979,"children":1980},{"class":429,"line":598},[1981],{"type":44,"tag":427,"props":1982,"children":1983},{},[1984],{"type":50,"value":1985},"  createSubTransactionRollupRules(rules: $rules) {\n",{"type":44,"tag":427,"props":1987,"children":1988},{"class":429,"line":607},[1989],{"type":44,"tag":427,"props":1990,"children":1991},{},[1992],{"type":50,"value":1993},"    results {\n",{"type":44,"tag":427,"props":1995,"children":1996},{"class":429,"line":1004},[1997],{"type":44,"tag":427,"props":1998,"children":1999},{},[2000],{"type":50,"value":2001},"      rollupRuleId\n",{"type":44,"tag":427,"props":2003,"children":2004},{"class":429,"line":1013},[2005],{"type":44,"tag":427,"props":2006,"children":2007},{},[2008],{"type":50,"value":2009},"      validationIssues { blocking type message }\n",{"type":44,"tag":427,"props":2011,"children":2012},{"class":429,"line":1022},[2013],{"type":44,"tag":427,"props":2014,"children":2015},{},[2016],{"type":50,"value":2017},"    }\n",{"type":44,"tag":427,"props":2019,"children":2020},{"class":429,"line":1031},[2021],{"type":44,"tag":427,"props":2022,"children":2023},{},[2024],{"type":50,"value":1082},{"type":44,"tag":427,"props":2026,"children":2027},{"class":429,"line":1040},[2028],{"type":44,"tag":427,"props":2029,"children":2030},{},[2031],{"type":50,"value":613},{"type":44,"tag":53,"props":2033,"children":2034},{},[2035,2037,2043],{"type":50,"value":2036},"Each entry in ",{"type":44,"tag":110,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":50,"value":2042},"$rules",{"type":50,"value":2044}," (all camelCase):",{"type":44,"tag":416,"props":2046,"children":2050},{"className":2047,"code":2048,"language":2049,"meta":421,"style":421},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"ETH outflow gas — wallet-1 (daily)\",\n  \"interval\": \"DAY\",\n  \"createdBy\": \"AI\",\n  \"rule\": {\n    \"internalAccountId\": 123,\n    \"assetId\": \"ethereum_native\",\n    \"platform\": \"ETHEREUM\",\n    \"balanceFactor\": \"OUTFLOW\",\n    \"fees\": \"ONLY\",\n    \"methodIds\": [\"0x573ade81\"]\n  }\n}\n","json",[2051],{"type":44,"tag":110,"props":2052,"children":2053},{"__ignoreMap":421},[2054,2063,2105,2142,2179,2203,2234,2270,2306,2342,2378,2421,2428],{"type":44,"tag":427,"props":2055,"children":2056},{"class":429,"line":430},[2057],{"type":44,"tag":427,"props":2058,"children":2060},{"style":2059},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2061],{"type":50,"value":2062},"{\n",{"type":44,"tag":427,"props":2064,"children":2065},{"class":429,"line":598},[2066,2071,2076,2081,2086,2091,2097,2101],{"type":44,"tag":427,"props":2067,"children":2068},{"style":2059},[2069],{"type":50,"value":2070},"  \"",{"type":44,"tag":427,"props":2072,"children":2074},{"style":2073},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2075],{"type":50,"value":1565},{"type":44,"tag":427,"props":2077,"children":2078},{"style":2059},[2079],{"type":50,"value":2080},"\"",{"type":44,"tag":427,"props":2082,"children":2083},{"style":2059},[2084],{"type":50,"value":2085},":",{"type":44,"tag":427,"props":2087,"children":2088},{"style":2059},[2089],{"type":50,"value":2090}," \"",{"type":44,"tag":427,"props":2092,"children":2094},{"style":2093},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2095],{"type":50,"value":2096},"ETH outflow gas — wallet-1 (daily)",{"type":44,"tag":427,"props":2098,"children":2099},{"style":2059},[2100],{"type":50,"value":2080},{"type":44,"tag":427,"props":2102,"children":2103},{"style":2059},[2104],{"type":50,"value":538},{"type":44,"tag":427,"props":2106,"children":2107},{"class":429,"line":607},[2108,2112,2117,2121,2125,2129,2134,2138],{"type":44,"tag":427,"props":2109,"children":2110},{"style":2059},[2111],{"type":50,"value":2070},{"type":44,"tag":427,"props":2113,"children":2114},{"style":2073},[2115],{"type":50,"value":2116},"interval",{"type":44,"tag":427,"props":2118,"children":2119},{"style":2059},[2120],{"type":50,"value":2080},{"type":44,"tag":427,"props":2122,"children":2123},{"style":2059},[2124],{"type":50,"value":2085},{"type":44,"tag":427,"props":2126,"children":2127},{"style":2059},[2128],{"type":50,"value":2090},{"type":44,"tag":427,"props":2130,"children":2131},{"style":2093},[2132],{"type":50,"value":2133},"DAY",{"type":44,"tag":427,"props":2135,"children":2136},{"style":2059},[2137],{"type":50,"value":2080},{"type":44,"tag":427,"props":2139,"children":2140},{"style":2059},[2141],{"type":50,"value":538},{"type":44,"tag":427,"props":2143,"children":2144},{"class":429,"line":1004},[2145,2149,2154,2158,2162,2166,2171,2175],{"type":44,"tag":427,"props":2146,"children":2147},{"style":2059},[2148],{"type":50,"value":2070},{"type":44,"tag":427,"props":2150,"children":2151},{"style":2073},[2152],{"type":50,"value":2153},"createdBy",{"type":44,"tag":427,"props":2155,"children":2156},{"style":2059},[2157],{"type":50,"value":2080},{"type":44,"tag":427,"props":2159,"children":2160},{"style":2059},[2161],{"type":50,"value":2085},{"type":44,"tag":427,"props":2163,"children":2164},{"style":2059},[2165],{"type":50,"value":2090},{"type":44,"tag":427,"props":2167,"children":2168},{"style":2093},[2169],{"type":50,"value":2170},"AI",{"type":44,"tag":427,"props":2172,"children":2173},{"style":2059},[2174],{"type":50,"value":2080},{"type":44,"tag":427,"props":2176,"children":2177},{"style":2059},[2178],{"type":50,"value":538},{"type":44,"tag":427,"props":2180,"children":2181},{"class":429,"line":1013},[2182,2186,2190,2194,2198],{"type":44,"tag":427,"props":2183,"children":2184},{"style":2059},[2185],{"type":50,"value":2070},{"type":44,"tag":427,"props":2187,"children":2188},{"style":2073},[2189],{"type":50,"value":508},{"type":44,"tag":427,"props":2191,"children":2192},{"style":2059},[2193],{"type":50,"value":2080},{"type":44,"tag":427,"props":2195,"children":2196},{"style":2059},[2197],{"type":50,"value":2085},{"type":44,"tag":427,"props":2199,"children":2200},{"style":2059},[2201],{"type":50,"value":2202}," {\n",{"type":44,"tag":427,"props":2204,"children":2205},{"class":429,"line":1022},[2206,2211,2216,2220,2224,2230],{"type":44,"tag":427,"props":2207,"children":2208},{"style":2059},[2209],{"type":50,"value":2210},"    \"",{"type":44,"tag":427,"props":2212,"children":2214},{"style":2213},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2215],{"type":50,"value":138},{"type":44,"tag":427,"props":2217,"children":2218},{"style":2059},[2219],{"type":50,"value":2080},{"type":44,"tag":427,"props":2221,"children":2222},{"style":2059},[2223],{"type":50,"value":2085},{"type":44,"tag":427,"props":2225,"children":2227},{"style":2226},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2228],{"type":50,"value":2229}," 123",{"type":44,"tag":427,"props":2231,"children":2232},{"style":2059},[2233],{"type":50,"value":538},{"type":44,"tag":427,"props":2235,"children":2236},{"class":429,"line":1031},[2237,2241,2245,2249,2253,2257,2262,2266],{"type":44,"tag":427,"props":2238,"children":2239},{"style":2059},[2240],{"type":50,"value":2210},{"type":44,"tag":427,"props":2242,"children":2243},{"style":2213},[2244],{"type":50,"value":1127},{"type":44,"tag":427,"props":2246,"children":2247},{"style":2059},[2248],{"type":50,"value":2080},{"type":44,"tag":427,"props":2250,"children":2251},{"style":2059},[2252],{"type":50,"value":2085},{"type":44,"tag":427,"props":2254,"children":2255},{"style":2059},[2256],{"type":50,"value":2090},{"type":44,"tag":427,"props":2258,"children":2259},{"style":2093},[2260],{"type":50,"value":2261},"ethereum_native",{"type":44,"tag":427,"props":2263,"children":2264},{"style":2059},[2265],{"type":50,"value":2080},{"type":44,"tag":427,"props":2267,"children":2268},{"style":2059},[2269],{"type":50,"value":538},{"type":44,"tag":427,"props":2271,"children":2272},{"class":429,"line":1040},[2273,2277,2281,2285,2289,2293,2298,2302],{"type":44,"tag":427,"props":2274,"children":2275},{"style":2059},[2276],{"type":50,"value":2210},{"type":44,"tag":427,"props":2278,"children":2279},{"style":2213},[2280],{"type":50,"value":477},{"type":44,"tag":427,"props":2282,"children":2283},{"style":2059},[2284],{"type":50,"value":2080},{"type":44,"tag":427,"props":2286,"children":2287},{"style":2059},[2288],{"type":50,"value":2085},{"type":44,"tag":427,"props":2290,"children":2291},{"style":2059},[2292],{"type":50,"value":2090},{"type":44,"tag":427,"props":2294,"children":2295},{"style":2093},[2296],{"type":50,"value":2297},"ETHEREUM",{"type":44,"tag":427,"props":2299,"children":2300},{"style":2059},[2301],{"type":50,"value":2080},{"type":44,"tag":427,"props":2303,"children":2304},{"style":2059},[2305],{"type":50,"value":538},{"type":44,"tag":427,"props":2307,"children":2308},{"class":429,"line":1049},[2309,2313,2317,2321,2325,2329,2334,2338],{"type":44,"tag":427,"props":2310,"children":2311},{"style":2059},[2312],{"type":50,"value":2210},{"type":44,"tag":427,"props":2314,"children":2315},{"style":2213},[2316],{"type":50,"value":146},{"type":44,"tag":427,"props":2318,"children":2319},{"style":2059},[2320],{"type":50,"value":2080},{"type":44,"tag":427,"props":2322,"children":2323},{"style":2059},[2324],{"type":50,"value":2085},{"type":44,"tag":427,"props":2326,"children":2327},{"style":2059},[2328],{"type":50,"value":2090},{"type":44,"tag":427,"props":2330,"children":2331},{"style":2093},[2332],{"type":50,"value":2333},"OUTFLOW",{"type":44,"tag":427,"props":2335,"children":2336},{"style":2059},[2337],{"type":50,"value":2080},{"type":44,"tag":427,"props":2339,"children":2340},{"style":2059},[2341],{"type":50,"value":538},{"type":44,"tag":427,"props":2343,"children":2344},{"class":429,"line":1058},[2345,2349,2353,2357,2361,2365,2370,2374],{"type":44,"tag":427,"props":2346,"children":2347},{"style":2059},[2348],{"type":50,"value":2210},{"type":44,"tag":427,"props":2350,"children":2351},{"style":2213},[2352],{"type":50,"value":544},{"type":44,"tag":427,"props":2354,"children":2355},{"style":2059},[2356],{"type":50,"value":2080},{"type":44,"tag":427,"props":2358,"children":2359},{"style":2059},[2360],{"type":50,"value":2085},{"type":44,"tag":427,"props":2362,"children":2363},{"style":2059},[2364],{"type":50,"value":2090},{"type":44,"tag":427,"props":2366,"children":2367},{"style":2093},[2368],{"type":50,"value":2369},"ONLY",{"type":44,"tag":427,"props":2371,"children":2372},{"style":2059},[2373],{"type":50,"value":2080},{"type":44,"tag":427,"props":2375,"children":2376},{"style":2059},[2377],{"type":50,"value":538},{"type":44,"tag":427,"props":2379,"children":2380},{"class":429,"line":1067},[2381,2385,2390,2394,2398,2403,2407,2412,2416],{"type":44,"tag":427,"props":2382,"children":2383},{"style":2059},[2384],{"type":50,"value":2210},{"type":44,"tag":427,"props":2386,"children":2387},{"style":2213},[2388],{"type":50,"value":2389},"methodIds",{"type":44,"tag":427,"props":2391,"children":2392},{"style":2059},[2393],{"type":50,"value":2080},{"type":44,"tag":427,"props":2395,"children":2396},{"style":2059},[2397],{"type":50,"value":2085},{"type":44,"tag":427,"props":2399,"children":2400},{"style":2059},[2401],{"type":50,"value":2402}," [",{"type":44,"tag":427,"props":2404,"children":2405},{"style":2059},[2406],{"type":50,"value":2080},{"type":44,"tag":427,"props":2408,"children":2409},{"style":2093},[2410],{"type":50,"value":2411},"0x573ade81",{"type":44,"tag":427,"props":2413,"children":2414},{"style":2059},[2415],{"type":50,"value":2080},{"type":44,"tag":427,"props":2417,"children":2418},{"style":2059},[2419],{"type":50,"value":2420},"]\n",{"type":44,"tag":427,"props":2422,"children":2423},{"class":429,"line":1076},[2424],{"type":44,"tag":427,"props":2425,"children":2426},{"style":2059},[2427],{"type":50,"value":1082},{"type":44,"tag":427,"props":2429,"children":2430},{"class":429,"line":1085},[2431],{"type":44,"tag":427,"props":2432,"children":2433},{"style":2059},[2434],{"type":50,"value":613},{"type":44,"tag":161,"props":2436,"children":2437},{},[2438,2454,2475,2500],{"type":44,"tag":165,"props":2439,"children":2440},{},[2441,2452],{"type":44,"tag":59,"props":2442,"children":2443},{},[2444,2446],{"type":50,"value":2445},"Always set ",{"type":44,"tag":110,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":50,"value":2451},"createdBy: \"AI\"",{"type":50,"value":2453}," so the rule is attributed to AI in the audit trail.",{"type":44,"tag":165,"props":2455,"children":2456},{},[2457,2473],{"type":44,"tag":59,"props":2458,"children":2459},{},[2460,2462,2467,2468],{"type":50,"value":2461},"Omit ",{"type":44,"tag":110,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":50,"value":313},{"type":50,"value":732},{"type":44,"tag":110,"props":2469,"children":2471},{"className":2470},[],[2472],{"type":50,"value":321},{"type":50,"value":2474}," unless the user wants the rule bounded — omitting them\nmakes the rule open-ended.",{"type":44,"tag":165,"props":2476,"children":2477},{},[2478,2483,2485,2491,2493,2498],{"type":44,"tag":59,"props":2479,"children":2480},{},[2481],{"type":50,"value":2482},"Only include optional filter fields the user\u002Fanalysis actually set",{"type":50,"value":2484}," — do NOT send\n",{"type":44,"tag":110,"props":2486,"children":2488},{"className":2487},[],[2489],{"type":50,"value":2490},"null",{"type":50,"value":2492}," for unused optional fields, just omit them from the ",{"type":44,"tag":110,"props":2494,"children":2496},{"className":2495},[],[2497],{"type":50,"value":508},{"type":50,"value":2499}," object.",{"type":44,"tag":165,"props":2501,"children":2502},{},[2503,2505,2510,2512,2518],{"type":50,"value":2504},"Prefer ",{"type":44,"tag":59,"props":2506,"children":2507},{},[2508],{"type":50,"value":2509},"creating new rules",{"type":50,"value":2511},". Editing an existing PENDING rule (via top-level\n",{"type":44,"tag":110,"props":2513,"children":2515},{"className":2514},[],[2516],{"type":50,"value":2517},"ruleId: \u003Cid>",{"type":50,"value":2519},") is supported, but pending rules may be auto-approved after a delay, so an\nin-place edit can race with activation — only edit pending when the user explicitly asks.",{"type":44,"tag":53,"props":2521,"children":2522},{},[2523],{"type":44,"tag":59,"props":2524,"children":2525},{},[2526],{"type":50,"value":2527},"Enum values (GraphQL enums, NOT quoted strings, in the query):",{"type":44,"tag":161,"props":2529,"children":2530},{},[2531,2553,2591,2615,2689,2736],{"type":44,"tag":165,"props":2532,"children":2533},{},[2534,2539,2541,2546,2547],{"type":44,"tag":110,"props":2535,"children":2537},{"className":2536},[],[2538],{"type":50,"value":2116},{"type":50,"value":2540},": ",{"type":44,"tag":110,"props":2542,"children":2544},{"className":2543},[],[2545],{"type":50,"value":2133},{"type":50,"value":553},{"type":44,"tag":110,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":50,"value":2552},"MONTH",{"type":44,"tag":165,"props":2554,"children":2555},{},[2556,2561,2563,2568,2569,2575,2576,2582,2583,2589],{"type":44,"tag":110,"props":2557,"children":2559},{"className":2558},[],[2560],{"type":50,"value":477},{"type":50,"value":2562},": UPPERCASE — ",{"type":44,"tag":110,"props":2564,"children":2566},{"className":2565},[],[2567],{"type":50,"value":2297},{"type":50,"value":140},{"type":44,"tag":110,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":50,"value":2574},"BASE",{"type":50,"value":140},{"type":44,"tag":110,"props":2577,"children":2579},{"className":2578},[],[2580],{"type":50,"value":2581},"SOLANA",{"type":50,"value":140},{"type":44,"tag":110,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":50,"value":2588},"BITCOIN",{"type":50,"value":2590},", …",{"type":44,"tag":165,"props":2592,"children":2593},{},[2594,2599,2600,2606,2608,2613],{"type":44,"tag":110,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":50,"value":146},{"type":50,"value":2540},{"type":44,"tag":110,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":50,"value":2605},"INFLOW",{"type":50,"value":2607}," (incoming, +1) or ",{"type":44,"tag":110,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":50,"value":2333},{"type":50,"value":2614}," (outgoing, -1)",{"type":44,"tag":165,"props":2616,"children":2617},{},[2618,2623,2624,2630,2632,2638,2640,2645,2647,2651,2653,2658,2659,2664,2666,2672,2674,2679,2681,2687],{"type":44,"tag":110,"props":2619,"children":2621},{"className":2620},[],[2622],{"type":50,"value":544},{"type":50,"value":2540},{"type":44,"tag":110,"props":2625,"children":2627},{"className":2626},[],[2628],{"type":50,"value":2629},"INCLUDE",{"type":50,"value":2631}," (txs + their fees), ",{"type":44,"tag":110,"props":2633,"children":2635},{"className":2634},[],[2636],{"type":50,"value":2637},"EXCLUDE",{"type":50,"value":2639}," (txs without fees), ",{"type":44,"tag":110,"props":2641,"children":2643},{"className":2642},[],[2644],{"type":50,"value":2369},{"type":50,"value":2646}," (only the fee\nsub-txs — selects GAS ",{"type":44,"tag":59,"props":2648,"children":2649},{},[2650],{"type":50,"value":1421},{"type":50,"value":2652}," FEE). For a gas\u002Ffee rollup use ",{"type":44,"tag":110,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":50,"value":1616},{"type":50,"value":1731},{"type":44,"tag":59,"props":2660,"children":2661},{},[2662],{"type":50,"value":2663},"by itself",{"type":50,"value":2665},";\ndo NOT also set ",{"type":44,"tag":110,"props":2667,"children":2669},{"className":2668},[],[2670],{"type":50,"value":2671},"subtxType: GAS\u002FFEE",{"type":50,"value":2673}," — ",{"type":44,"tag":110,"props":2675,"children":2677},{"className":2676},[],[2678],{"type":50,"value":2369},{"type":50,"value":2680}," already covers them, and adding\n",{"type":44,"tag":110,"props":2682,"children":2684},{"className":2683},[],[2685],{"type":50,"value":2686},"subtxType: GAS",{"type":50,"value":2688}," is redundant and wrongly drops the FEE sub-txs.",{"type":44,"tag":165,"props":2690,"children":2691},{},[2692,2697,2699,2705,2707,2713,2714,2720,2721,2727,2729,2734],{"type":44,"tag":110,"props":2693,"children":2695},{"className":2694},[],[2696],{"type":50,"value":838},{"type":50,"value":2698},": a ",{"type":44,"tag":110,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":50,"value":2704},"FinancialAction",{"type":50,"value":2706}," enum or null — e.g. ",{"type":44,"tag":110,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":50,"value":2712},"REWARD",{"type":50,"value":140},{"type":44,"tag":110,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":50,"value":2719},"NATIVE_TRANSFER",{"type":50,"value":538},{"type":44,"tag":110,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":50,"value":2726},"TOKEN_TRANSFER",{"type":50,"value":2728},". Leave null for gas\u002Ffee rollups (use ",{"type":44,"tag":110,"props":2730,"children":2732},{"className":2731},[],[2733],{"type":50,"value":1616},{"type":50,"value":2735}," instead).",{"type":44,"tag":165,"props":2737,"children":2738},{},[2739,2744,2745],{"type":44,"tag":110,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":50,"value":2153},{"type":50,"value":2540},{"type":44,"tag":110,"props":2746,"children":2748},{"className":2747},[],[2749],{"type":50,"value":2170},{"type":44,"tag":53,"props":2751,"children":2752},{},[2753,2758,2760,2765,2766,2772,2773,2779,2781,2786,2788,2794],{"type":44,"tag":59,"props":2754,"children":2755},{},[2756],{"type":50,"value":2757},"Platform casing:",{"type":50,"value":2759}," lowercase in query ",{"type":44,"tag":251,"props":2761,"children":2762},{},[2763],{"type":50,"value":2764},"filters",{"type":50,"value":108},{"type":44,"tag":110,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":50,"value":2771},"subTransaction(asset_In: [...])",{"type":50,"value":538},{"type":44,"tag":110,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":50,"value":2778},"asset(platform: \"ethereum\")",{"type":50,"value":2780},"); UPPERCASE enum in ",{"type":44,"tag":251,"props":2782,"children":2783},{},[2784],{"type":50,"value":2785},"mutation",{"type":50,"value":2787}," inputs (",{"type":44,"tag":110,"props":2789,"children":2791},{"className":2790},[],[2792],{"type":50,"value":2793},"rule.platform: ETHEREUM",{"type":50,"value":2795},"). Query return values are UPPERCASE too.",{"type":44,"tag":53,"props":2797,"children":2798},{},[2799],{"type":44,"tag":59,"props":2800,"children":2801},{},[2802],{"type":50,"value":2803},"Validation rules the server enforces (never propose a rule that breaks these):",{"type":44,"tag":161,"props":2805,"children":2806},{},[2807,2838,2871,2887],{"type":44,"tag":165,"props":2808,"children":2809},{},[2810,2816,2818,2822,2824,2830,2832,2836],{"type":44,"tag":110,"props":2811,"children":2813},{"className":2812},[],[2814],{"type":50,"value":2815},"senderIdentifier",{"type":50,"value":2817}," is only valid on ",{"type":44,"tag":59,"props":2819,"children":2820},{},[2821],{"type":50,"value":2605},{"type":50,"value":2823}," rules; ",{"type":44,"tag":110,"props":2825,"children":2827},{"className":2826},[],[2828],{"type":50,"value":2829},"recipientIdentifier",{"type":50,"value":2831}," only on\n",{"type":44,"tag":59,"props":2833,"children":2834},{},[2835],{"type":50,"value":2333},{"type":50,"value":2837}," rules (on an outflow the sender is always your wallet, and vice versa).",{"type":44,"tag":165,"props":2839,"children":2840},{},[2841,2846,2848,2854,2856,2861,2863,2869],{"type":44,"tag":110,"props":2842,"children":2844},{"className":2843},[],[2845],{"type":50,"value":2815},{"type":50,"value":2847}," ⊥ ",{"type":44,"tag":110,"props":2849,"children":2851},{"className":2850},[],[2852],{"type":50,"value":2853},"originalSenderPrefix",{"type":50,"value":2855},"; ",{"type":44,"tag":110,"props":2857,"children":2859},{"className":2858},[],[2860],{"type":50,"value":2829},{"type":50,"value":2862}," ⊥\n",{"type":44,"tag":110,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":50,"value":2868},"originalRecipientPrefix",{"type":50,"value":2870}," (mutually exclusive).",{"type":44,"tag":165,"props":2872,"children":2873},{},[2874,2879,2881,2886],{"type":44,"tag":110,"props":2875,"children":2877},{"className":2876},[],[2878],{"type":50,"value":313},{"type":50,"value":2880}," must be before ",{"type":44,"tag":110,"props":2882,"children":2884},{"className":2883},[],[2885],{"type":50,"value":321},{"type":50,"value":964},{"type":44,"tag":165,"props":2888,"children":2889},{},[2890,2892,2897],{"type":50,"value":2891},"An identical rule (same ",{"type":44,"tag":110,"props":2893,"children":2895},{"className":2894},[],[2896],{"type":50,"value":508},{"type":50,"value":2898}," JSON) cannot already exist for the org.",{"type":44,"tag":53,"props":2900,"children":2901},{},[2902,2904,2910],{"type":50,"value":2903},"The mutation also re-checks matching transactions and overlaps and returns those as\n",{"type":44,"tag":110,"props":2905,"children":2907},{"className":2906},[],[2908],{"type":50,"value":2909},"validationIssues",{"type":50,"value":2911}," — the rollup_review gate should have caught them already, but the server\nis the final authority.",{"type":44,"tag":239,"props":2913,"children":2915},{"id":2914},"resolving-assetid-and-internalaccountid",[2916,2918,2923,2924],{"type":50,"value":2917},"Resolving ",{"type":44,"tag":110,"props":2919,"children":2921},{"className":2920},[],[2922],{"type":50,"value":1127},{"type":50,"value":380},{"type":44,"tag":110,"props":2925,"children":2927},{"className":2926},[],[2928],{"type":50,"value":138},{"type":44,"tag":161,"props":2930,"children":2931},{},[2932,2942],{"type":44,"tag":165,"props":2933,"children":2934},{},[2935,2940],{"type":44,"tag":110,"props":2936,"children":2938},{"className":2937},[],[2939],{"type":50,"value":138},{"type":50,"value":2941}," (integer): from the Step 1 wallet inventory.",{"type":44,"tag":165,"props":2943,"children":2944},{},[2945,2950,2952,2956,2958,2964,2966,2971,2972,2978,2979,2985,2987,2993],{"type":44,"tag":110,"props":2946,"children":2948},{"className":2947},[],[2949],{"type":50,"value":1127},{"type":50,"value":2951}," is the asset ",{"type":44,"tag":59,"props":2953,"children":2954},{},[2955],{"type":50,"value":1119},{"type":50,"value":2957}," = ",{"type":44,"tag":110,"props":2959,"children":2961},{"className":2960},[],[2962],{"type":50,"value":2963},"\"\u003Cplatform_lowercase>_\u003Cidentifier>\"",{"type":50,"value":2965},". Native tokens:\n",{"type":44,"tag":110,"props":2967,"children":2969},{"className":2968},[],[2970],{"type":50,"value":2261},{"type":50,"value":140},{"type":44,"tag":110,"props":2973,"children":2975},{"className":2974},[],[2976],{"type":50,"value":2977},"base_native",{"type":50,"value":140},{"type":44,"tag":110,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":50,"value":2984},"solana_native",{"type":50,"value":2986},". ERC-20:\n",{"type":44,"tag":110,"props":2988,"children":2990},{"className":2989},[],[2991],{"type":50,"value":2992},"ethereum_0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",{"type":50,"value":2994}," (USDC). Step 2a already returns keys\nin the groupKey; otherwise look them up:",{"type":44,"tag":416,"props":2996,"children":2998},{"className":418,"code":2997,"language":420,"meta":421,"style":421},"query AssetKeys { asset(key_In: [\"ethereum_native\"]) { results { key identifier platform symbol name parentPlatform } } }\n",[2999],{"type":44,"tag":110,"props":3000,"children":3001},{"__ignoreMap":421},[3002],{"type":44,"tag":427,"props":3003,"children":3004},{"class":429,"line":430},[3005],{"type":44,"tag":427,"props":3006,"children":3007},{},[3008],{"type":50,"value":2997},{"type":44,"tag":150,"props":3010,"children":3011},{},[],{"type":44,"tag":154,"props":3013,"children":3015},{"id":3014},"step-6-report-outcomes",[3016],{"type":50,"value":3017},"Step 6 — Report Outcomes",{"type":44,"tag":53,"props":3019,"children":3020},{},[3021,3023,3028,3030,3035,3037,3042],{"type":50,"value":3022},"For each per-rule result in the batch response, color-code the outcome so the user sees\nstatus at a glance — ",{"type":44,"tag":59,"props":3024,"children":3025},{},[3026],{"type":50,"value":3027},"🟢 green",{"type":50,"value":3029}," = created with no issues, ",{"type":44,"tag":59,"props":3031,"children":3032},{},[3033],{"type":50,"value":3034},"🟡 yellow",{"type":50,"value":3036}," = created with\nnon-blocking validation issues, ",{"type":44,"tag":59,"props":3038,"children":3039},{},[3040],{"type":50,"value":3041},"🔴 red",{"type":50,"value":3043}," = blocked \u002F not created:",{"type":44,"tag":161,"props":3045,"children":3046},{},[3047,3065,3082],{"type":44,"tag":165,"props":3048,"children":3049},{},[3050,3056,3058,3063],{"type":44,"tag":110,"props":3051,"children":3053},{"className":3052},[],[3054],{"type":50,"value":3055},"rollupRuleId",{"type":50,"value":3057}," present, no ",{"type":44,"tag":110,"props":3059,"children":3061},{"className":3060},[],[3062],{"type":50,"value":2909},{"type":50,"value":3064}," → 🟢 created",{"type":44,"tag":165,"props":3066,"children":3067},{},[3068,3073,3075,3080],{"type":44,"tag":110,"props":3069,"children":3071},{"className":3070},[],[3072],{"type":50,"value":3055},{"type":50,"value":3074}," present with only non-blocking ",{"type":44,"tag":110,"props":3076,"children":3078},{"className":3077},[],[3079],{"type":50,"value":2909},{"type":50,"value":3081}," → 🟡 created, issue noted",{"type":44,"tag":165,"props":3083,"children":3084},{},[3085,3087,3092,3094,3100,3102,3107,3109],{"type":50,"value":3086},"any ",{"type":44,"tag":110,"props":3088,"children":3090},{"className":3089},[],[3091],{"type":50,"value":2909},{"type":50,"value":3093}," with ",{"type":44,"tag":110,"props":3095,"children":3097},{"className":3096},[],[3098],{"type":50,"value":3099},"blocking: true",{"type":50,"value":3101}," (no ",{"type":44,"tag":110,"props":3103,"children":3105},{"className":3104},[],[3106],{"type":50,"value":3055},{"type":50,"value":3108},") → 🔴 FAILED, quote the\n",{"type":44,"tag":110,"props":3110,"children":3112},{"className":3111},[],[3113],{"type":50,"value":3114},"message",{"type":44,"tag":53,"props":3116,"children":3117},{},[3118,3120,3126],{"type":50,"value":3119},"Created rules start in ",{"type":44,"tag":110,"props":3121,"children":3123},{"className":3122},[],[3124],{"type":50,"value":3125},"PENDING",{"type":50,"value":3127}," status and activate on the next processing cycle. Use the\nsame 🟢\u002F🟡\u002F🔴 coding in the Step 3 report when surfacing the rollup_review validation\noutcome per proposed rule.",{"type":44,"tag":150,"props":3129,"children":3130},{},[],{"type":44,"tag":154,"props":3132,"children":3134},{"id":3133},"a-list-existing-rollup-rules",[3135],{"type":50,"value":3136},"A. List existing rollup rules",{"type":44,"tag":53,"props":3138,"children":3139},{},[3140],{"type":50,"value":3141},"When the user just wants to see current rules:",{"type":44,"tag":416,"props":3143,"children":3145},{"className":418,"code":3144,"language":420,"meta":421,"style":421},"query ListRollupRules($limit: Int, $offset: Int, $status_In: [String]) {\n  subTransactionRollupRule(limit: $limit, offset: $offset, status_In: $status_In) {\n    totalCount\n    results { id name interval startDate endDate nextActivationDate status rule }\n  }\n}\n",[3146],{"type":44,"tag":110,"props":3147,"children":3148},{"__ignoreMap":421},[3149,3157,3165,3173,3181,3188],{"type":44,"tag":427,"props":3150,"children":3151},{"class":429,"line":430},[3152],{"type":44,"tag":427,"props":3153,"children":3154},{},[3155],{"type":50,"value":3156},"query ListRollupRules($limit: Int, $offset: Int, $status_In: [String]) {\n",{"type":44,"tag":427,"props":3158,"children":3159},{"class":429,"line":598},[3160],{"type":44,"tag":427,"props":3161,"children":3162},{},[3163],{"type":50,"value":3164},"  subTransactionRollupRule(limit: $limit, offset: $offset, status_In: $status_In) {\n",{"type":44,"tag":427,"props":3166,"children":3167},{"class":429,"line":607},[3168],{"type":44,"tag":427,"props":3169,"children":3170},{},[3171],{"type":50,"value":3172},"    totalCount\n",{"type":44,"tag":427,"props":3174,"children":3175},{"class":429,"line":1004},[3176],{"type":44,"tag":427,"props":3177,"children":3178},{},[3179],{"type":50,"value":3180},"    results { id name interval startDate endDate nextActivationDate status rule }\n",{"type":44,"tag":427,"props":3182,"children":3183},{"class":429,"line":1013},[3184],{"type":44,"tag":427,"props":3185,"children":3186},{},[3187],{"type":50,"value":1082},{"type":44,"tag":427,"props":3189,"children":3190},{"class":429,"line":1022},[3191],{"type":44,"tag":427,"props":3192,"children":3193},{},[3194],{"type":50,"value":613},{"type":44,"tag":53,"props":3196,"children":3197},{},[3198,3200,3206,3208,3214,3216,3222],{"type":50,"value":3199},"Variables: ",{"type":44,"tag":110,"props":3201,"children":3203},{"className":3202},[],[3204],{"type":50,"value":3205},"{\"limit\": 50, \"offset\": 0}",{"type":50,"value":3207}," (add ",{"type":44,"tag":110,"props":3209,"children":3211},{"className":3210},[],[3212],{"type":50,"value":3213},"status_In: [\"Active\"]",{"type":50,"value":3215}," etc. to filter;\nstatus is title-case). Present as a numbered markdown table: Name, ID, Status, Interval,\nDate range (or \"indefinite\"), and the key rule filters (wallet, asset, direction, fees, any\noptional filter). Paginate if ",{"type":44,"tag":110,"props":3217,"children":3219},{"className":3218},[],[3220],{"type":50,"value":3221},"totalCount > 50",{"type":50,"value":964},{"type":44,"tag":150,"props":3224,"children":3225},{},[],{"type":44,"tag":154,"props":3227,"children":3229},{"id":3228},"c-delete-rollup-rules",[3230],{"type":50,"value":3231},"C. Delete rollup rules",{"type":44,"tag":53,"props":3233,"children":3234},{},[3235,3237,3241],{"type":50,"value":3236},"Only ",{"type":44,"tag":59,"props":3238,"children":3239},{},[3240],{"type":50,"value":3125},{"type":50,"value":3242}," rules can be deleted via the API. Active rules require TRES support.",{"type":44,"tag":53,"props":3244,"children":3245},{},[3246],{"type":50,"value":3247},"First list the rules (Section A) so the user can identify which to delete, then confirm the\nrule ID(s) before deleting.",{"type":44,"tag":416,"props":3249,"children":3251},{"className":418,"code":3250,"language":420,"meta":421,"style":421},"mutation DeleteRollupRules($ruleIds: [Int]!) {\n  deleteSubTransactionRollupRules(ruleIds: $ruleIds) {\n    results { deletedIds failures { ruleId reason } }\n  }\n}\n",[3252],{"type":44,"tag":110,"props":3253,"children":3254},{"__ignoreMap":421},[3255,3263,3271,3279,3286],{"type":44,"tag":427,"props":3256,"children":3257},{"class":429,"line":430},[3258],{"type":44,"tag":427,"props":3259,"children":3260},{},[3261],{"type":50,"value":3262},"mutation DeleteRollupRules($ruleIds: [Int]!) {\n",{"type":44,"tag":427,"props":3264,"children":3265},{"class":429,"line":598},[3266],{"type":44,"tag":427,"props":3267,"children":3268},{},[3269],{"type":50,"value":3270},"  deleteSubTransactionRollupRules(ruleIds: $ruleIds) {\n",{"type":44,"tag":427,"props":3272,"children":3273},{"class":429,"line":607},[3274],{"type":44,"tag":427,"props":3275,"children":3276},{},[3277],{"type":50,"value":3278},"    results { deletedIds failures { ruleId reason } }\n",{"type":44,"tag":427,"props":3280,"children":3281},{"class":429,"line":1004},[3282],{"type":44,"tag":427,"props":3283,"children":3284},{},[3285],{"type":50,"value":1082},{"type":44,"tag":427,"props":3287,"children":3288},{"class":429,"line":1013},[3289],{"type":44,"tag":427,"props":3290,"children":3291},{},[3292],{"type":50,"value":613},{"type":44,"tag":53,"props":3294,"children":3295},{},[3296,3298,3304,3306,3312],{"type":50,"value":3297},"Report ",{"type":44,"tag":110,"props":3299,"children":3301},{"className":3300},[],[3302],{"type":50,"value":3303},"deletedIds",{"type":50,"value":3305}," (succeeded) and ",{"type":44,"tag":110,"props":3307,"children":3309},{"className":3308},[],[3310],{"type":50,"value":3311},"failures",{"type":50,"value":3313}," (with reasons — typically the rule is\nalready active).",{"type":44,"tag":150,"props":3315,"children":3316},{},[],{"type":44,"tag":154,"props":3318,"children":3320},{"id":3319},"rule-field-reference-rolluprule",[3321],{"type":50,"value":3322},"Rule Field Reference (RollupRule)",{"type":44,"tag":53,"props":3324,"children":3325},{},[3326,3331,3332,3337,3339,3344,3346,3351,3353,3358,3360,3365],{"type":44,"tag":59,"props":3327,"children":3328},{},[3329],{"type":50,"value":3330},"Required:",{"type":50,"value":1731},{"type":44,"tag":110,"props":3333,"children":3335},{"className":3334},[],[3336],{"type":50,"value":138},{"type":50,"value":3338}," (int), ",{"type":44,"tag":110,"props":3340,"children":3342},{"className":3341},[],[3343],{"type":50,"value":1127},{"type":50,"value":3345}," (asset key), ",{"type":44,"tag":110,"props":3347,"children":3349},{"className":3348},[],[3350],{"type":50,"value":477},{"type":50,"value":3352}," (enum),\n",{"type":44,"tag":110,"props":3354,"children":3356},{"className":3355},[],[3357],{"type":50,"value":146},{"type":50,"value":3359}," (INFLOW\u002FOUTFLOW), ",{"type":44,"tag":110,"props":3361,"children":3363},{"className":3362},[],[3364],{"type":50,"value":544},{"type":50,"value":3366}," (INCLUDE\u002FEXCLUDE\u002FONLY).",{"type":44,"tag":53,"props":3368,"children":3369},{},[3370,3375,3376,3381,3382,3387,3388,3393,3394,3399,3400,3405,3407,3413,3414,3420,3421,3427,3429,3435,3437,3442,3444,3450,3452,3458,3460,3466,3468,3474,3475,3481],{"type":44,"tag":59,"props":3371,"children":3372},{},[3373],{"type":50,"value":3374},"Optional (have safe defaults — only set when needed):",{"type":50,"value":1731},{"type":44,"tag":110,"props":3377,"children":3379},{"className":3378},[],[3380],{"type":50,"value":2815},{"type":50,"value":538},{"type":44,"tag":110,"props":3383,"children":3385},{"className":3384},[],[3386],{"type":50,"value":2829},{"type":50,"value":140},{"type":44,"tag":110,"props":3389,"children":3391},{"className":3390},[],[3392],{"type":50,"value":2853},{"type":50,"value":140},{"type":44,"tag":110,"props":3395,"children":3397},{"className":3396},[],[3398],{"type":50,"value":2868},{"type":50,"value":140},{"type":44,"tag":110,"props":3401,"children":3403},{"className":3402},[],[3404],{"type":50,"value":2389},{"type":50,"value":3406},"\n(list), ",{"type":44,"tag":110,"props":3408,"children":3410},{"className":3409},[],[3411],{"type":50,"value":3412},"maxAmount",{"type":50,"value":140},{"type":44,"tag":110,"props":3415,"children":3417},{"className":3416},[],[3418],{"type":50,"value":3419},"minAmount",{"type":50,"value":140},{"type":44,"tag":110,"props":3422,"children":3424},{"className":3423},[],[3425],{"type":50,"value":3426},"excludeFiat",{"type":50,"value":3428}," (default false), ",{"type":44,"tag":110,"props":3430,"children":3432},{"className":3431},[],[3433],{"type":50,"value":3434},"excludeInternal",{"type":50,"value":3436}," (default\nfalse), ",{"type":44,"tag":110,"props":3438,"children":3440},{"className":3439},[],[3441],{"type":50,"value":838},{"type":50,"value":3443}," (FinancialAction), ",{"type":44,"tag":110,"props":3445,"children":3447},{"className":3446},[],[3448],{"type":50,"value":3449},"bufferInDays",{"type":50,"value":3451}," (default 0; days to wait for\nlate-arriving txs), ",{"type":44,"tag":110,"props":3453,"children":3455},{"className":3454},[],[3456],{"type":50,"value":3457},"cutoffTime",{"type":50,"value":3459}," (\"HH:MM\"), ",{"type":44,"tag":110,"props":3461,"children":3463},{"className":3462},[],[3464],{"type":50,"value":3465},"rollupInternalTransfersOnly",{"type":50,"value":3467}," (default false;\nwhen true, only internal transfers are rolled up and the rollup is paired with its inflow —\nthe system also sets ",{"type":44,"tag":110,"props":3469,"children":3471},{"className":3470},[],[3472],{"type":50,"value":3473},"mergeWithInflowTx",{"type":50,"value":380},{"type":44,"tag":110,"props":3476,"children":3478},{"className":3477},[],[3479],{"type":50,"value":3480},"runInternalTransferClassificationOnRollups",{"type":50,"value":1675},{"type":44,"tag":53,"props":3483,"children":3484},{},[3485,3490,3491,3496,3498,3503,3504,3509,3511,3516,3518,3523,3524,3530,3532,3537,3539,3544],{"type":44,"tag":59,"props":3486,"children":3487},{},[3488],{"type":50,"value":3489},"Top-level request fields:",{"type":50,"value":1731},{"type":44,"tag":110,"props":3492,"children":3494},{"className":3493},[],[3495],{"type":50,"value":1565},{"type":50,"value":3497}," (required), ",{"type":44,"tag":110,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":50,"value":2116},{"type":50,"value":3497},{"type":44,"tag":110,"props":3505,"children":3507},{"className":3506},[],[3508],{"type":50,"value":508},{"type":50,"value":3510}," (required),\n",{"type":44,"tag":110,"props":3512,"children":3514},{"className":3513},[],[3515],{"type":50,"value":313},{"type":50,"value":3517}," (optional), ",{"type":44,"tag":110,"props":3519,"children":3521},{"className":3520},[],[3522],{"type":50,"value":321},{"type":50,"value":3517},{"type":44,"tag":110,"props":3525,"children":3527},{"className":3526},[],[3528],{"type":50,"value":3529},"ruleId",{"type":50,"value":3531}," (optional — edit a pending rule),\n",{"type":44,"tag":110,"props":3533,"children":3535},{"className":3534},[],[3536],{"type":50,"value":2153},{"type":50,"value":3538}," (set ",{"type":44,"tag":110,"props":3540,"children":3542},{"className":3541},[],[3543],{"type":50,"value":2170},{"type":50,"value":1675},{"type":44,"tag":53,"props":3546,"children":3547},{},[3548,3560],{"type":44,"tag":59,"props":3549,"children":3550},{},[3551,3553,3558],{"type":50,"value":3552},"FinancialAction enum values (for ",{"type":44,"tag":110,"props":3554,"children":3556},{"className":3555},[],[3557],{"type":50,"value":838},{"type":50,"value":3559},"):",{"type":50,"value":3561}," TRACE_TRANSFER, TOKEN_TRANSFER,\nNATIVE_TRANSFER, DELEGATION, UNDELEGATION, VEST, UNVEST, VALIDATOR_CREATION, REWARD,\nCOMMISSION, GAS, FEE, EXCHANGE_WITHDRAWAL, EXCHANGE_DEPOSIT, EXCHANGE_TRANSFER,\nEXCHANGE_BUY, EXCHANGE_SELL, EXCHANGE_LOAN, EXCHANGE_SETTLEMENT, REBATE, FIAT_TRANSFER,\nBURNED, ROLLUP, ROLLUP_FEE, PLUG, GROUP, FUNDING, INTEREST, TRANSFER_DELEGATION_REWARD,\nREEVALUATION, PAYMENT, BANK_DEPOSIT, BANK_WITHDRAWAL, MINING_REWARD.",{"type":44,"tag":150,"props":3563,"children":3564},{},[],{"type":44,"tag":154,"props":3566,"children":3568},{"id":3567},"rules",[3569],{"type":50,"value":3570},"Rules",{"type":44,"tag":161,"props":3572,"children":3573},{},[3574,3584,3594,3604,3614,3624,3634,3644],{"type":44,"tag":165,"props":3575,"children":3576},{},[3577,3582],{"type":44,"tag":59,"props":3578,"children":3579},{},[3580],{"type":50,"value":3581},"KEEP CONTEXT SMALL",{"type":50,"value":3583}," — use aggregations, never fetch full result sets.",{"type":44,"tag":165,"props":3585,"children":3586},{},[3587,3592],{"type":44,"tag":59,"props":3588,"children":3589},{},[3590],{"type":50,"value":3591},"Run discovery queries in parallel",{"type":50,"value":3593}," where possible.",{"type":44,"tag":165,"props":3595,"children":3596},{},[3597,3602],{"type":44,"tag":59,"props":3598,"children":3599},{},[3600],{"type":50,"value":3601},"ALWAYS run the Step 2.5 rollup_review gate",{"type":50,"value":3603}," before presenting.",{"type":44,"tag":165,"props":3605,"children":3606},{},[3607,3612],{"type":44,"tag":59,"props":3608,"children":3609},{},[3610],{"type":50,"value":3611},"ALWAYS produce both the HTML report AND the proposal table",{"type":50,"value":3613}," after analysis.",{"type":44,"tag":165,"props":3615,"children":3616},{},[3617,3622],{"type":44,"tag":59,"props":3618,"children":3619},{},[3620],{"type":50,"value":3621},"Explain your reasoning",{"type":50,"value":3623}," for each proposed rule.",{"type":44,"tag":165,"props":3625,"children":3626},{},[3627,3632],{"type":44,"tag":59,"props":3628,"children":3629},{},[3630],{"type":50,"value":3631},"Always confirm before creating",{"type":50,"value":3633}," — present the full proposal and wait for explicit\napproval before calling the create mutation.",{"type":44,"tag":165,"props":3635,"children":3636},{},[3637,3642],{"type":44,"tag":59,"props":3638,"children":3639},{},[3640],{"type":50,"value":3641},"Provide a brief conversational summary",{"type":50,"value":3643}," after presenting the report.",{"type":44,"tag":165,"props":3645,"children":3646},{},[3647,3652],{"type":44,"tag":59,"props":3648,"children":3649},{},[3650],{"type":50,"value":3651},"Incorporate user clustering guidance",{"type":50,"value":3653}," when choosing dimensions.",{"type":44,"tag":150,"props":3655,"children":3656},{},[],{"type":44,"tag":154,"props":3658,"children":3660},{"id":3659},"limitations-not-available-via-mcp",[3661],{"type":50,"value":3662},"Limitations — not available via MCP",{"type":44,"tag":1338,"props":3664,"children":3665},{},[3666,3683,3693,3703],{"type":44,"tag":165,"props":3667,"children":3668},{},[3669,3674,3676,3681],{"type":44,"tag":59,"props":3670,"children":3671},{},[3672],{"type":50,"value":3673},"Editing active rules",{"type":50,"value":3675}," — there is no edit for an active rule; recreate (PENDING rules\ncan be edited via ",{"type":44,"tag":110,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":50,"value":3529},{"type":50,"value":3682},", or deleted and recreated).",{"type":44,"tag":165,"props":3684,"children":3685},{},[3686,3691],{"type":44,"tag":59,"props":3687,"children":3688},{},[3689],{"type":50,"value":3690},"Activating\u002Fdeactivating rules",{"type":50,"value":3692}," — managed by the backend processing pipeline, not\ndirectly controllable via API.",{"type":44,"tag":165,"props":3694,"children":3695},{},[3696,3701],{"type":44,"tag":59,"props":3697,"children":3698},{},[3699],{"type":50,"value":3700},"Viewing rollup breakdown",{"type":50,"value":3702}," — the detailed breakdown of which raw transactions were\naggregated is in the Rollup Breakdown report in the TRES dashboard.",{"type":44,"tag":165,"props":3704,"children":3705},{},[3706,3711],{"type":44,"tag":59,"props":3707,"children":3708},{},[3709],{"type":50,"value":3710},"Active rule deletion",{"type":50,"value":3712}," — only PENDING rules can be deleted via the API; direct the\nuser to TRES support for active rules.",{"type":44,"tag":3714,"props":3715,"children":3716},"style",{},[3717],{"type":50,"value":3718},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3720,"total":3907},[3721,3742,3756,3768,3787,3800,3821,3841,3855,3870,3878,3891],{"slug":3722,"name":3722,"fn":3723,"description":3724,"org":3725,"tags":3726,"stars":3739,"repoUrl":3740,"updatedAt":3741},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3727,3730,3733,3736],{"name":3728,"slug":3729,"type":16},"Creative","creative",{"name":3731,"slug":3732,"type":16},"Design","design",{"name":3734,"slug":3735,"type":16},"Generative Art","generative-art",{"name":3737,"slug":3738,"type":16},"JavaScript","javascript",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:15.455818",{"slug":3743,"name":3743,"fn":3744,"description":3745,"org":3746,"tags":3747,"stars":3739,"repoUrl":3740,"updatedAt":3755},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3748,3751,3752],{"name":3749,"slug":3750,"type":16},"Branding","branding",{"name":3731,"slug":3732,"type":16},{"name":3753,"slug":3754,"type":16},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":3757,"name":3757,"fn":3758,"description":3759,"org":3760,"tags":3761,"stars":3739,"repoUrl":3740,"updatedAt":3767},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3762,3763,3764],{"name":3728,"slug":3729,"type":16},{"name":3731,"slug":3732,"type":16},{"name":3765,"slug":3766,"type":16},"PDF","pdf","2026-04-06T17:56:03.794732",{"slug":3769,"name":3769,"fn":3770,"description":3771,"org":3772,"tags":3773,"stars":3739,"repoUrl":3740,"updatedAt":3786},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3774,3777,3778,3781,3783],{"name":3775,"slug":3776,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":3779,"slug":3780,"type":16},"Anthropic SDK","anthropic-sdk",{"name":3782,"slug":3769,"type":16},"Claude API",{"name":3784,"slug":3785,"type":16},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":3788,"name":3788,"fn":3789,"description":3790,"org":3791,"tags":3792,"stars":3739,"repoUrl":3740,"updatedAt":3799},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3793,3796],{"name":3794,"slug":3795,"type":16},"Documentation","documentation",{"name":3797,"slug":3798,"type":16},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":3801,"name":3801,"fn":3802,"description":3803,"org":3804,"tags":3805,"stars":3739,"repoUrl":3740,"updatedAt":3820},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3806,3809,3811,3814,3817],{"name":3807,"slug":3808,"type":16},"Documents","documents",{"name":3810,"slug":3801,"type":16},"DOCX",{"name":3812,"slug":3813,"type":16},"Office","office",{"name":3815,"slug":3816,"type":16},"Templates","templates",{"name":3818,"slug":3819,"type":16},"Word","word","2026-07-18T05:16:23.136271",{"slug":3822,"name":3822,"fn":3823,"description":3824,"org":3825,"tags":3826,"stars":3739,"repoUrl":3740,"updatedAt":3840},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3827,3828,3831,3834,3837],{"name":3731,"slug":3732,"type":16},{"name":3829,"slug":3830,"type":16},"Frontend","frontend",{"name":3832,"slug":3833,"type":16},"React","react",{"name":3835,"slug":3836,"type":16},"Tailwind CSS","tailwind-css",{"name":3838,"slug":3839,"type":16},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":3842,"name":3842,"fn":3843,"description":3844,"org":3845,"tags":3846,"stars":3739,"repoUrl":3740,"updatedAt":3854},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3847,3850,3851],{"name":3848,"slug":3849,"type":16},"Communications","communications",{"name":3815,"slug":3816,"type":16},{"name":3852,"slug":3853,"type":16},"Writing","writing","2026-04-06T17:56:20.695522",{"slug":3856,"name":3856,"fn":3857,"description":3858,"org":3859,"tags":3860,"stars":3739,"repoUrl":3740,"updatedAt":3869},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3861,3862,3865,3866],{"name":3775,"slug":3776,"type":16},{"name":3863,"slug":3864,"type":16},"API Development","api-development",{"name":3784,"slug":3785,"type":16},{"name":3867,"slug":3868,"type":16},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":3766,"name":3766,"fn":3871,"description":3872,"org":3873,"tags":3874,"stars":3739,"repoUrl":3740,"updatedAt":3877},"read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3875,3876],{"name":3807,"slug":3808,"type":16},{"name":3765,"slug":3766,"type":16},"2026-04-06T17:56:02.483316",{"slug":3879,"name":3879,"fn":3880,"description":3881,"org":3882,"tags":3883,"stars":3739,"repoUrl":3740,"updatedAt":3890},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3884,3887],{"name":3885,"slug":3886,"type":16},"PowerPoint","powerpoint",{"name":3888,"slug":3889,"type":16},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":3892,"name":3892,"fn":3893,"description":3894,"org":3895,"tags":3896,"stars":3739,"repoUrl":3740,"updatedAt":3906},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3897,3898,3899,3902,3905],{"name":3775,"slug":3776,"type":16},{"name":3794,"slug":3795,"type":16},{"name":3900,"slug":3901,"type":16},"Evals","evals",{"name":3903,"slug":3904,"type":16},"Performance","performance",{"name":3797,"slug":3798,"type":16},"2026-04-19T06:45:40.804",490,{"items":3909,"total":4007},[3910,3927,3946,3960,3972,3982,3994],{"slug":3911,"name":3911,"fn":3912,"description":3913,"org":3914,"tags":3915,"stars":26,"repoUrl":27,"updatedAt":3926},"quickdesign","generate AI media assets","Use the `quickdesign` CLI to generate AI media — UGC promo videos, image edits, product creatives, video upscales — through Seedance, Kling, Sora2, Nano Banana, and GPT Image. Invoke this skill whenever the user asks for a talking-avatar video, multi-segment ad \u002F promo \u002F explainer, image edit (object swap, angle change, state change), product photoshoot, or video upscale via QuickDesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3916,3917,3920,3923],{"name":3728,"slug":3729,"type":16},{"name":3918,"slug":3919,"type":16},"Image Generation","image-generation",{"name":3921,"slug":3922,"type":16},"Marketing","marketing",{"name":3924,"slug":3925,"type":16},"Video","video","2026-07-01T08:09:32.316182",{"slug":3928,"name":3928,"fn":3929,"description":3930,"org":3931,"tags":3932,"stars":26,"repoUrl":27,"updatedAt":3945},"testdino-audit","audit Playwright test code","Use only when the user explicitly asks for a TestDino audit of Playwright automated test code. Routes through the audit tools the TestDino MCP server exposes (get_audit_report + submit_audit_report, or the legacy test_audit). For generic code review or non-Playwright targets, do a normal review instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3933,3936,3939,3942],{"name":3934,"slug":3935,"type":16},"Audit","audit",{"name":3937,"slug":3938,"type":16},"Code Analysis","code-analysis",{"name":3940,"slug":3941,"type":16},"Playwright","playwright",{"name":3943,"slug":3944,"type":16},"Testing","testing","2026-07-02T07:37:17.341081",{"slug":3947,"name":3947,"fn":3948,"description":3949,"org":3950,"tags":3951,"stars":26,"repoUrl":27,"updatedAt":3959},"testdino-health","manage TestDino connection status","Use when the user wants to check TestDino connection status, validate their PAT, discover available organizations and projects, or find the right projectId. Always call this first when the project context is ambiguous before any other TestDino tool.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3952,3955,3958],{"name":3953,"slug":3954,"type":16},"Monitoring","monitoring",{"name":3956,"slug":3957,"type":16},"QA","qa",{"name":3943,"slug":3944,"type":16},"2026-07-02T07:37:18.566504",{"slug":3961,"name":3961,"fn":3962,"description":3963,"org":3964,"tags":3965,"stars":26,"repoUrl":27,"updatedAt":3971},"testdino-manual-runs","manage manual QA execution runs in TestDino","Use when the user wants to manage a manual execution run or update case-level results inside a run — listing runs, creating runs for a release, inspecting a run, assigning cases, or marking case results (passed\u002Ffailed\u002Fblocked\u002Fskipped\u002Fretest\u002Funtested). Accepts counter-style IDs like RUN-12 and TC-156.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3966,3969,3970],{"name":3967,"slug":3968,"type":16},"Operations","operations",{"name":3956,"slug":3957,"type":16},{"name":3943,"slug":3944,"type":16},"2026-07-02T07:37:23.446065",{"slug":3973,"name":3973,"fn":3974,"description":3975,"org":3976,"tags":3977,"stars":26,"repoUrl":27,"updatedAt":3981},"testdino-manual-tests","manage manual QA test cases in TestDino","Use when the user wants to create, update, or browse manual QA test cases and suites in TestDino — not execution runs. Covers list_manual_test_suites, list_manual_test_cases, get_manual_test_case, create_manual_test_case, update_manual_test_case, create_manual_test_suite.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3978,3979,3980],{"name":3794,"slug":3795,"type":16},{"name":3956,"slug":3957,"type":16},{"name":3943,"slug":3944,"type":16},"2026-07-02T07:37:22.247052",{"slug":3983,"name":3983,"fn":3984,"description":3985,"org":3986,"tags":3987,"stars":26,"repoUrl":27,"updatedAt":3993},"testdino-releases","manage TestDino releases and milestones","Use when the user wants to browse, inspect, create, or update releases\u002Fmilestones in a TestDino project. Covers list_releases, get_release, create_release, and update_release. Accepts counter-style IDs like MS-12.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3988,3991,3992],{"name":3989,"slug":3990,"type":16},"Project Management","project-management",{"name":3956,"slug":3957,"type":16},{"name":3943,"slug":3944,"type":16},"2026-07-02T07:37:19.793846",{"slug":3995,"name":3995,"fn":3996,"description":3997,"org":3998,"tags":3999,"stars":26,"repoUrl":27,"updatedAt":4006},"testdino-runs","inspect automated test runs","Use when the user wants to inspect automated test runs, list failed or flaky tests, debug a failing testcase with historical context, or filter runs by branch, commit, author, environment, browser, status, or tags. Includes list_testruns, get_run_details, list_testcase, get_testcase_details, and debug_testcase.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4000,4003,4004,4005],{"name":4001,"slug":4002,"type":16},"Debugging","debugging",{"name":3940,"slug":3941,"type":16},{"name":3956,"slug":3957,"type":16},{"name":3943,"slug":3944,"type":16},"2026-07-02T07:37:16.07175",30]