{"id":"16f45f21-7eaa-4d40-81f5-f140873ee21f","entityType":"agent","slug":"clawhub-poppin-fumi-slv-grpc-geyser","name":"Slv Grpc Geyser","canonicalUrl":"https://www.xpersona.co/agent/clawhub-poppin-fumi-slv-grpc-geyser","canonicalPath":"/agent/clawhub-poppin-fumi-slv-grpc-geyser","generatedAt":"2026-10-10T06:14:19.440Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":null},"description":"Ansible playbooks and templates for deploying and managing Solana gRPC Geyser streaming nodes with Yellowstone or Richat plugins.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-grpc-geyser","sourceUrl":"https://clawhub.ai/poppin-fumi/slv-grpc-geyser","homepage":"https://clawhub.ai/poppin-fumi/skills/slv-grpc-geyser","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/poppin-fumi/slv-grpc-geyser","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/poppin-fumi/skills/slv-grpc-geyser","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":56,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Slv Grpc Geyser technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":null},"stars":null,"forks":null,"downloads":1700,"packageName":null,"latestVersion":"0.13.15","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T04:09:12.947Z","lastCrawledAt":"2026-10-10T04:09:12.947Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T04:09:12.947Z","lastVerifiedAt":null,"highlights":[{"version":"0.13.15","createdAt":"2026-03-30T17:42:37.422Z","changelog":"Version 0.13.15 of slv-grpc-geyser has no user-facing changes. - No file changes detected in this release. - All behavior and documentation remain the same.","fileCount":7,"zipByteSize":10374},{"version":"0.13.14","createdAt":"2026-03-30T12:27:17.531Z","changelog":"No user-visible changes in this release. - No file changes detected compared to the previous version. - Documentation, playbooks, templates, and command mappings remain unchanged.","fileCount":6,"zipByteSize":9103},{"version":"0.13.13","createdAt":"2026-03-27T20:35:08.310Z","changelog":"- Documentation updated in SKILL.md for clarity and formatting. - No changes to code or functional logic. - All configuration variables, usage, and interactive flow remain the same. - This version updates documentation only.","fileCount":6,"zipByteSize":9103},{"version":"0.13.12","createdAt":"2026-03-27T20:11:39.548Z","changelog":"No changes detected in this version. - Version 0.13.12 introduces no file changes. All existing features, commands, and documentation remain unchanged.","fileCount":6,"zipByteSize":8953},{"version":"0.13.11","createdAt":"2026-03-27T16:05:34.504Z","changelog":"No changes detected in this version (0.13.11). - No file changes were made compared to the previous release. - Documentation, features, and behavior remain unchanged.","fileCount":6,"zipByteSize":8953},{"version":"0.13.9","createdAt":"2026-03-27T15:10:21.994Z","changelog":"No user-visible changes in this version. - No file changes detected; content remains unchanged from the previous version.","fileCount":6,"zipByteSize":8952},{"version":"0.13.7","createdAt":"2026-03-27T13:26:16.937Z","changelog":"No changes in this release. - Version 0.13.7 includes no code or documentation modifications.","fileCount":6,"zipByteSize":8952},{"version":"0.13.6","createdAt":"2026-03-25T20:00:20.055Z","changelog":"No user-facing changes in this release. - Version bump to 0.13.6 with no detected file or documentation changes.","fileCount":6,"zipByteSize":8952}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-grpc-geyser","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-grpc-geyser` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/poppin-fumi/slv-grpc-geyser before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T06:14:19.438Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-grpc-geyser/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":null},"readme":"Skill: Slv Grpc Geyser\n\nOwner: poppin-fumi\n\nSummary: Ansible playbooks and templates for deploying and managing Solana gRPC Geyser streaming nodes with Yellowstone or Richat plugins.\n\nTags: ansible:0.9.962, blockchain:0.9.962, geyser:0.9.962, grpc:0.9.962, infrastructure:0.9.962, latest:0.13.15, solana:0.9.962, streaming:0.9.962\n\nVersion history:\n\nv0.13.15 | 2026-03-30T17:42:37.422Z | auto\n\nVersion 0.13.15 of slv-grpc-geyser has no user-facing changes.\n\n- No file changes detected in this release.\n- All behavior and documentation remain the same.\n\nv0.13.14 | 2026-03-30T12:27:17.531Z | auto\n\nNo user-visible changes in this release.\n\n- No file changes detected compared to the previous version.\n- Documentation, playbooks, templates, and command mappings remain unchanged.\n\nv0.13.13 | 2026-03-27T20:35:08.310Z | auto\n\n- Documentation updated in SKILL.md for clarity and formatting.\n- No changes to code or functional logic.\n- All configuration variables, usage, and interactive flow remain the same.\n- This version updates documentation only.\n\nv0.13.12 | 2026-03-27T20:11:39.548Z | auto\n\nNo changes detected in this version.\n\n- Version 0.13.12 introduces no file changes. All existing features, commands, and documentation remain unchanged.\n\nv0.13.11 | 2026-03-27T16:05:34.504Z | auto\n\nNo changes detected in this version (0.13.11).\n\n- No file changes were made compared to the previous release.\n- Documentation, features, and behavior remain unchanged.\n\nv0.13.9 | 2026-03-27T15:10:21.994Z | auto\n\nNo user-visible changes in this version.\n- No file changes detected; content remains unchanged from the previous version.\n\nv0.13.7 | 2026-03-27T13:26:16.937Z | auto\n\nNo changes in this release.\n\n- Version 0.13.7 includes no code or documentation modifications.\n\nv0.13.6 | 2026-03-25T20:00:20.055Z | auto\n\nNo user-facing changes in this release.\n\n- Version bump to 0.13.6 with no detected file or documentation changes.\n\nv0.13.5 | 2026-03-25T19:02:21.944Z | auto\n\nNo changes detected in this release.\n\n- No file changes or documentation updates.\n- Behavior, features, and usage remain unchanged from the previous version.\n\nv0.13.4 | 2026-03-25T17:00:16.622Z | auto\n\n- No changes in code or documentation; this release has no file modifications.\n- All features and configuration options remain the same as the previous version.\n\nv0.13.1 | 2026-03-25T15:35:46.622Z | auto\n\nNo user-facing changes in this version.\n\n- Version bump to 0.13.1 with no detected file changes.\n\nv0.13.0 | 2026-03-25T14:28:04.447Z | auto\n\nVersion 0.13.0 of slv-grpc-geyser\n\n- No user-visible changes in this release.\n- Documentation remains unchanged.\n- No file modifications detected.\n\nv0.11.10 | 2026-03-20T12:12:13.691Z | auto\n\nNo user-facing changes in this version.\n\n- No file changes detected between previous and current version.\n- Documentation, commands, and feature descriptions remain unchanged.\n\nv0.11.9 | 2026-03-19T17:40:50.499Z | auto\n\nNo user-facing changes in this version.\n\n- No file changes detected.\n- Documentation and behavior remain unchanged from previous version.\n\nv0.11.8 | 2026-03-19T11:05:50.402Z | auto\n\nNo user-facing changes in this release.\n\n- No file changes detected between previous and current versions.\n- No updates to documentation, playbooks, or templates.\n\nv0.11.7 | 2026-03-18T22:17:01.654Z | auto\n\nNo user-facing changes in this version.\n\n- No file changes detected between versions.\n- Documentation and functionality are unchanged.\n\nv0.11.6 | 2026-03-18T19:49:05.626Z | auto\n\nNo changes in functionality or documentation.\n\n- Version bump to 0.11.6 with no file changes detected.\n- All documentation and code remain unchanged from the previous release.\n\nv0.11.5 | 2026-03-18T17:34:50.673Z | auto\n\n- Version bump to 0.11.5.\n- No file or documentation changes in this release.\n\nv0.11.4 | 2026-03-18T16:52:52.980Z | auto\n\n- No changes detected in this release; documentation and code remain unchanged.\n- Version bump to 0.11.4 with no modifications to SKILL.md or any other files.\n\nv0.11.3 | 2026-03-18T13:28:43.530Z | auto\n\nNo changes in this version.\n\n- No file changes detected; documentation and implementation remain the same.\n\nv0.11.2 | 2026-03-17T18:27:16.144Z | auto\n\nVersion 0.11.2 of slv-grpc-geyser includes no file changes.\n\n- No modifications were detected in this release.\n- Documentation, code, and templates remain unchanged from the previous version.\n\nv0.11.1 | 2026-03-17T17:20:46.423Z | auto\n\nVersion 0.11.1 of slv-grpc-geyser\n\n- No file changes detected in this release.\n- Documentation, usage, variables, supported configurations, and CLI mapping remain unchanged.\n- No new features, bug fixes, or updates identified for this version.\n\nv0.11.0 | 2026-03-17T16:09:28.481Z | auto\n\nNo user-facing changes in this release.\n\n- No file changes were detected between the previous and current version.\n\nv0.10.2 | 2026-02-24T16:44:41.363Z | auto\n\n- Removed the skill.json file from the repository.\n- No changes were made to documentation or functionality.\n- Skill structure and usage remain unchanged.\n\nv0.9.962 | 2026-02-24T09:41:14.881Z | user\n\nInitial release: AI-powered Solana gRPC Geyser streaming node deployment. Playbooks at https://github.com/ValidatorsDAO/slv\n\nArchive index:\n\nArchive v0.13.15: 7 files, 10374 bytes\n\nFiles: AGENT.md (7211b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), skill-card.md (2348b), SKILL.md (7091b), _meta.json (136b)\n\nFile v0.13.15:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.15:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.15:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.15\",\n  \"publishedAt\": 1774892557422\n}\n\nFile v0.13.15:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll playbooks are stored in `~/.slv/template/{version}/ansible/`.\nTo find the latest version directory:\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\n```\n\nExample (mainnet RPC):\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\nansible-playbook -i ~/.slv/inventory.mainnet.rpcs.yml \\\n  ${TEMPLATE_DIR}ansible/mainnet-rpc/init.yml --limit <identity_pubkey>\n```\n\nDo NOT use the skill's own `ansible/` directory for execution. Those files are reference copies.\nThe runtime playbooks live in `~/.slv/template/`.\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.15:skill-card.md\n\n## Description:\n\nAnsible playbooks and templates for deploying and managing Solana gRPC Geyser streaming nodes with Yellowstone or Richat plugins.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[poppin-fumi](https://clawhub.ai/user/poppin-fumi)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Solana infrastructure operators use this skill to plan, configure, and run Ansible workflows for deploying or maintaining gRPC Geyser streaming nodes, including Yellowstone gRPC or Richat plugin builds.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Remote administration playbooks can change node state, restart services, or affect production availability.\n\nMitigation: Run dry-run or check mode first, review planned variables and target hosts, and require change approval before production restarts or updates.\n\nRisk: Runtime playbooks are resolved from ~/.slv/template/ and may differ from the artifact's reference copies.\n\nMitigation: Review the resolved template directory and playbook path before execution, and install only from trusted SLV template sources.\n\nRisk: Automatic prerequisite setup may install packages or use elevated package-manager commands on the operator host.\n\nMitigation: Prefer manually installing pinned prerequisites, and review setup behavior before running automatic installation paths.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/poppin-fumi/skills/slv-grpc-geyser)\n- [Yellowstone gRPC](https://github.com/rpcpool/yellowstone-grpc)\n- [Richat](https://github.com/lamports-dev/richat)\n- [ERPC Snapshot Network](https://erpc.global/en/)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration]\n\n**Output Format:** [Markdown guidance with inline shell commands and YAML inventory examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces deployment guidance and command proposals; users should review before running commands on target hosts.]\n\n## Skill Version(s):\n\n0.13.15 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.13.15:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.14: 6 files, 9103 bytes\n\nFiles: AGENT.md (7211b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (136b)\n\nFile v0.13.14:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.14:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.14:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.14\",\n  \"publishedAt\": 1774873637531\n}\n\nFile v0.13.14:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll playbooks are stored in `~/.slv/template/{version}/ansible/`.\nTo find the latest version directory:\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\n```\n\nExample (mainnet RPC):\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\nansible-playbook -i ~/.slv/inventory.mainnet.rpcs.yml \\\n  ${TEMPLATE_DIR}ansible/mainnet-rpc/init.yml --limit <identity_pubkey>\n```\n\nDo NOT use the skill's own `ansible/` directory for execution. Those files are reference copies.\nThe runtime playbooks live in `~/.slv/template/`.\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.14:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.13: 6 files, 9103 bytes\n\nFiles: AGENT.md (7211b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (136b)\n\nFile v0.13.13:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.13:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.13:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.13\",\n  \"publishedAt\": 1774643708310\n}\n\nFile v0.13.13:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll playbooks are stored in `~/.slv/template/{version}/ansible/`.\nTo find the latest version directory:\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\n```\n\nExample (mainnet RPC):\n```bash\nTEMPLATE_DIR=$(ls -d ~/.slv/template/*/ | sort -V | tail -1)\nansible-playbook -i ~/.slv/inventory.mainnet.rpcs.yml \\\n  ${TEMPLATE_DIR}ansible/mainnet-rpc/init.yml --limit <identity_pubkey>\n```\n\nDo NOT use the skill's own `ansible/` directory for execution. Those files are reference copies.\nThe runtime playbooks live in `~/.slv/template/`.\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.13:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.12: 6 files, 8953 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (136b)\n\nFile v0.13.12:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.12:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.12:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.12\",\n  \"publishedAt\": 1774642299548\n}\n\nFile v0.13.12:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll paths are relative to the skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.12:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.11: 6 files, 8953 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (136b)\n\nFile v0.13.11:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.11:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.11:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.11\",\n  \"publishedAt\": 1774627534504\n}\n\nFile v0.13.11:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll paths are relative to the skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.11:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.9: 6 files, 8952 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (135b)\n\nFile v0.13.9:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.9:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.9:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.9\",\n  \"publishedAt\": 1774624221994\n}\n\nFile v0.13.9:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll paths are relative to the skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.9:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.7: 6 files, 8952 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (135b)\n\nFile v0.13.7:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.7:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.7:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.7\",\n  \"publishedAt\": 1774617976937\n}\n\nFile v0.13.7:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll paths are relative to the skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.7:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.6: 6 files, 8952 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (135b)\n\nFile v0.13.6:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version tag | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `port_grpc` | gRPC listen port | `10000` |\n| `limit_ledger_size` | Ledger size limit | `100000000` |\n\n## Jinja Templates\n\n| Template | Description |\n|---|---|\n| `start-validator.sh.j2` | Main start script (branches by `rpc_type`) |\n| `start-mainnet-rpc-grpc.sh.j2` | gRPC-specific start script |\n| `geyser.json.j2` | Yellowstone gRPC config |\n| `geyser-richat.json.j2` | Richat gRPC config |\n| `richat-setting.yml.j2` | Richat settings |\n| `richat.service.j2` | Richat systemd service |\n| `firedancer-config.toml.j2` | Firedancer config |\n| `firedancer.service.j2` | Firedancer systemd service |\n| `solv.service.j2` | Solv systemd service |\n| `generate_configs.sh.j2` | Config generation script |\n\n## Geyser Plugin Sources\n\nBoth plugins are built from source (no binary downloads):\n- **Yellowstone gRPC**: https://github.com/rpcpool/yellowstone-grpc\n- **Richat**: https://github.com/lamports-dev/richat\n\n## Usage\n\n```bash\n# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'\n```\n\nNo `versions.yml` required — all variables can be passed via `extra_vars`.\n\n## Interactive Deployment Flow\n\nSee `AGENT.md` for the full step-by-step flow and `examples/inventory.yml` for output format.\n\n### Required Variables\n\n| Variable | Prompt | Validation |\n|---|---|---|\n| `server_ip` | \"Target server IP?\" | Valid IPv4 |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"Geyser gRPC or Index RPC + gRPC?\" | `Geyser gRPC`, `Index RPC + gRPC` |\n| `validator_type` | \"Underlying client?\" | `agave`, `jito`, `jito-bam`, `firedancer-agave` |\n| `solana_version` | \"Solana version? (default: 3.1.8)\" | Semver |\n| `identity_account` | \"Node identity pubkey?\" | Base58 pubkey |\n| `snapshot_url` | \"Snapshot URL? (auto for ERPC)\" | URL (cannot be empty for init) |\n\n### Plugin Selection (choose ONE)\n\n| Plugin | Version Variable | Source | Output |\n|---|---|---|---|\n| Yellowstone gRPC | `yellowstone_grpc_version` | github.com/rpcpool/yellowstone-grpc | `libyellowstone_grpc_geyser.so` |\n| Richat | `richat_version` | github.com/lamports-dev/richat | `librichat_plugin_agave.so` |\n\nBoth are built from source (no pre-built binaries). Build time: ~15-30 min.\n**Only collect the version variable for the selected plugin.**\n\n### Conditionally Required Variables\n\n| Variable | When Required |\n|---|---|\n| `jito_version` | jito/jito-bam types |\n| `firedancer_version` | firedancer types |\n| `shred_receiver_address` | jito/jito-bam (auto by region) |\n| `block_engine_url` | jito/jito-bam (auto by region) |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_grpc` | `10000` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n\n### Optional: Reference RPC\n\n| Variable | Description | Default |\n|---|---|---|\n| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |\n\nERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.\n\n### Pre-flight: Fresh Server Setup\n\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\n\n### Deployment Command\n\nAll paths relative to skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'\n```\n\nFile v0.13.6:README.md\n\n# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n\nFile v0.13.6:_meta.json\n\n{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.6\",\n  \"publishedAt\": 1774468820055\n}\n\nFile v0.13.6:AGENT.md\n\n# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen port (default: `8899`, ERPC often uses `7211`)\n- `dynamic_port_range` — Port range (default: `8000-8025`)\n- `limit_ledger_size` — Ledger size limit (default: `100000000`)\n\n### Step 9: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 10: Jito-specific (if jito/jito-bam)\n- `shred_receiver_address` — Jito shred receiver (auto-select by region)\n- `block_engine_url` — Jito block engine URL (auto-select by region)\n\n### Step 11: Generate Inventory & Deploy\n1. Generate `inventory.yml` from collected variables\n2. Show user the generated inventory for confirmation\n3. Offer `--check` (dry-run) first\n4. On confirmation, run from the skill's `ansible/` directory:\n   ```bash\n   ansible-playbook -i inventory.yml mainnet-rpc/init.yml -e '{...}'\n   ```\n\n### Playbook Execution Directory\n\nAll paths are relative to the skill's `ansible/` directory:\n```bash\ncd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## Plugin Build Notes\n\nBoth Geyser plugins are built from source — no pre-built binaries:\n- **Yellowstone**: `cargo build --release` → `libyellowstone_grpc_geyser.so`\n- **Richat**: `cargo build --release` → `librichat_plugin_agave.so`\n\nBuild times vary by hardware (15-30 min on typical servers).\n\n## gRPC Geyser Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying a gRPC Geyser node, monitor startup completion:\n\n### Detection Logic\n\n1. **Local RPC Response Check** (every 30 seconds):\n   ```bash\n   curl -s http://localhost:8899 -X POST -H \"Content-Type: application/json\" \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}'\n   ```\n   - No response → still loading ledger, retry\n\n2. **gRPC Port Response Check** (after RPC responds):\n   ```bash\n   # Check if gRPC port is listening (default: 10000)\n   ss -tlnp | grep ':10000'\n   # Or use grpcurl if available:\n   grpcurl -plaintext localhost:10000 list\n   ```\n   - Port not listening → Geyser plugin still loading, retry\n   - Port listening and responding → gRPC service ready\n\n3. **Slot Sync Check** (every 60 seconds, after RPC responds):\n   ```bash\n   # Network latest slot (requires ERPC API key or other reference RPC)\n   NETWORK_SLOT=$(curl -s \"${REFERENCE_RPC_URL}\" \\\n     -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   # Local slot\n   LOCAL_SLOT=$(curl -s http://localhost:8899 -X POST -H 'Content-Type: application/json' \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}' | jq -r '.result')\n\n   DIFF=$((NETWORK_SLOT - LOCAL_SLOT))\n   ```\n\n4. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` AND gRPC port responding → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n5. **Health Endpoint**:\n   ```bash\n   curl -s http://localhost:8899/health\n   # Returns \"ok\" when healthy\n   ```\n\n### Optional: ERPC API Key\n\nFor full slot sync monitoring, an ERPC API key can be configured as `reference_rpc_url`.\nERPC API keys are free to obtain at https://erpc.global — **recommended for full monitoring**.\n\nWithout an API key, health check falls back to local `/health` endpoint and gRPC port check only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always confirm plugin version compatibility with Solana version**\n- **Geyser plugin updates require node restart** — warn the user\n\n## ⚠️ OSS Security\n\nThis is an open-source skill.\n- Do not include any internal API endpoints, hostnames, or credentials\n- Do not hardcode IP addresses of private infrastructure\n- Only publicly documented endpoints may be referenced\n\nFile v0.13.6:examples/inventory.yml\n\n# SLV gRPC Geyser — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\"}'\n\nall:\n  hosts:\n    grpc-1:\n      ansible_host: \"<server-ip>\"\n      ansible_user: \"solv\"\n      ansible_ssh_private_key_file: \"~/.ssh/id_rsa\"\n\n  vars:\n    # --- RPC Type ---\n    # Options: Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"Geyser gRPC\"\n\n    # --- Validator Type (underlying client) ---\n    # Options: agave, jito, jito-bam, firedancer-agave\n    validator_type: \"agave\"\n\n    # --- Versions ---\n    solana_version: \"3.1.8\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- gRPC ---\n    port_grpc: 10000\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n\nArchive v0.13.5: 6 files, 8953 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (135b)\n\nFile v0.13.5:SKILL.md\n\n# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat\n\nArchive v0.13.4: 6 files, 8952 bytes\n\nFiles: AGENT.md (6845b), examples/inventory.yml (824b), README.md (2030b), scripts/setup.sh (3398b), SKILL.md (7091b), _meta.json (135b)","readmeExcerpt":"Skill: Slv Grpc Geyser Owner: poppin-fumi Summary: Ansible playbooks and templates for deploying and managing Solana gRPC Geyser streaming nodes with Yellowstone or Richat plugins. Tags: ansible:0.9.962, blockchain:0.9.962, geyser:0.9.962, grpc:0.9.962, infrastructure:0.9.962, latest:0.13.15, solana:0.9.962, streaming:0.9.962 Version history: v0.13.15 | 2026-03-30T17:42:37.422Z | auto Version 0.13.15 of slv-grpc-geys","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"ansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates"},{"language":"bash","snippet":"# Deploy a new gRPC Geyser node\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"yellowstone_grpc_version\":\"v6.0.0\",\"snapshot_url\":\"https://...\"}'\n\n# Build/update Richat plugin\nansible-playbook -i inventory mainnet-rpc/geyser_richat_build.yml \\\n  -e '{\"richat_version\":\"richat-v8.1.0\"}'"},{"language":"bash","snippet":"ansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become"},{"language":"bash","snippet":"cd /path/to/slv-grpc-geyser/ansible/\nansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"<version>\",\"richat_version\":\"<version>\"}'"},{"language":"bash","snippet":"openclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\""},{"language":"bash","snippet":"cp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"# SLV gRPC Geyser Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana gRPC Geyser streaming nodes.\n\n## Supported Configurations\n\n| Config | Description |\n|---|---|\n| Yellowstone gRPC | Standard Geyser gRPC plugin (Triton/rpcpool) |\n| Richat gRPC | Richat Geyser plugin (lamports-dev) |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Playbooks (gRPC Geyser uses mainnet-rpc playbooks)\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\ngRPC Geyser nodes are managed via `slv r` (RPC) commands with `rpc_type` set to `Geyser gRPC` or `Index RPC + gRPC`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `mainnet-rpc/init.yml` | Full gRPC Geyser node initialization |\n| `slv r start` | `mainnet-rpc/start_node.yml` | Start node |\n| `slv r stop` | `mainnet-rpc/stop_node.yml` | Stop node |\n| `slv r restart` | `mainnet-rpc/restart_node.yml` | Restart node |\n| `slv r build:solana` | `mainnet-rpc/install_solana.yml` | Build Solana from source |\n| `slv r update:geyser` | `mainnet-rpc/update_geyser.yml` | Update Geyser plugin |\n| `slv r update:script` | `mainnet-rpc/update_startup_config.yml` | Update start-validator.sh |\n| `slv r setup:firedancer` | `mainnet-rpc/setup_firedancer.yml` | Setup Firedancer |\n\n## Key Playbooks\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full gRPC Geyser node initialization |\n| `init_richat_geyser.yml` | Richat Geyser initialization |\n| `geyser_build.yml` | Build Yellowstone gRPC from GitHub source |\n| `geyser_richat_build.yml` | Build Richat plugin from GitHub source |\n| `install_richat.yml` | Install Richat plugin |\n| `update_geyser.yml` | Update Geyser plugin |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n| `run_restarter.yml` | Run restarter script |\n\n## Geyser Build Details\n\n### Yellowstone gRPC (`geyser_build.yml`)\n- Clones from https://github.com/rpcpool/yellowstone-grpc\n- Builds with `cargo build --release`\n- Produces `libyellowstone_grpc_geyser.so`\n- Config template: `jinja/mainnet-rpc/geyser.json.j2`\n\n### Richat (`geyser_richat_build.yml`)\n- Clones from https://github.com/lamports-dev/richat\n- Builds with `cargo build --release`\n- Produces `librichat_plugin_agave.so`\n- Config template: `jinja/mainnet-rpc/geyser-richat.json.j2`\n- Service template: `jinja/mainnet-rpc/richat.service.j2`\n- Settings template: `jinja/mainnet-rpc/richat-setting.yml.j2`\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | Must be `Geyser gRPC` or `Index RPC + gRPC` | — |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, etc.) | — |\n| `solana_version` | Solana/Agave version | — "},{"path":"README.md","content":"# SLV gRPC Geyser Skill\n\nDeploy and manage Solana gRPC Geyser streaming nodes with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** high-performance gRPC Geyser streaming nodes\n- **Build** Geyser plugins from source (Yellowstone gRPC, Richat)\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** gRPC ports, plugin settings, and streaming filters\n\nSupported plugins:\n- **Yellowstone gRPC** — Standard Geyser gRPC plugin ([rpcpool/yellowstone-grpc](https://github.com/rpcpool/yellowstone-grpc))\n- **Richat** — High-throughput Geyser plugin ([lamports-dev/richat](https://github.com/lamports-dev/richat))\n\n## Prerequisites\n\n| Requirement | Version | Notes |\n|---|---|---|\n| `ansible-core` | >= 2.15 | `pip install ansible-core` |\n| SSH access | — | Key-based auth to target server |\n\n## Quick Start\n\n### With OpenClaw\n```bash\nopenclaw skill install slv-grpc-geyser\n\n# \"Deploy a gRPC Geyser node with Richat on 203.0.113.10\"\n```\n\n### Manual Usage\n```bash\ncp examples/inventory.yml my-inventory.yml\n# Edit with your server details\n\ncd ansible/\nansible-playbook -i ../my-inventory.yml mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Geyser gRPC\",\"solana_version\":\"3.1.8\",\"richat_version\":\"richat-v8.1.0\"}'\n```\n\n## Contents\n\n```\nSKILL.md              — AI-readable playbook knowledge + deployment flow\nAGENT.md              — Agent persona and behavior rules\nREADME.md             — This file\nexamples/\n  inventory.yml       — Sample Ansible inventory\nansible/\n  mainnet-rpc/        — Playbooks (gRPC Geyser uses mainnet-rpc)\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Config templates\n```\n\n## ERPC Snapshot Network\n\nServers purchased through [erpc.global](https://erpc.global/en/) automatically get access to ERPC's dedicated snapshot download endpoints — 7 global regions for fast node bootstrapping.\n\n## License\n\nApache-2.0 — See [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76bbxmyk0pqzf680j907rve581ff0f\",\n  \"slug\": \"slv-grpc-geyser\",\n  \"version\": \"0.13.15\",\n  \"publishedAt\": 1774892557422\n}"},{"path":"AGENT.md","content":"# SLV gRPC Geyser Agent\n\n## Identity\n\nYou are a **Solana gRPC Geyser streaming node specialist**. You deploy and manage\nhigh-performance Geyser gRPC streaming nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy gRPC Geyser streaming nodes (Yellowstone gRPC + Richat)\n- Build Geyser plugins from source (no binary downloads)\n- Manage node lifecycle (start, stop, restart, update)\n- Configure Geyser plugin settings (ports, filters, subscriptions)\n\n## Behavior\n\n1. **Security first**: Never expose private keys, tokens, or credentials\n2. **Confirm before destructive actions**: Always confirm before stop, restart, or plugin rebuild\n3. **Validate inputs**: Check IP format, version format, plugin compatibility\n4. **Explain what you're doing**: State which playbook and variables before execution\n5. **Interactive variable collection**: Guide users through required variables step by step\n\n## Interactive Init Flow\n\n### Step 0: Pre-flight — User Setup\nNew servers may not have the `solv` user:\n```bash\nansible-playbook -i inventory.yml cmn/add_solv.yml \\\n  -e '{\"ansible_user\":\"ubuntu\"}' --become\n```\nAsk: \"Is this a fresh server?\"\n\n### Step 1: Server Connection\n- `server_ip` — Target server IP address (required, validate IPv4)\n- `ssh_user` — SSH username (default: `solv`; `ubuntu`/`root` for fresh servers)\n- `ssh_key_path` — Path to SSH private key (default: `~/.ssh/id_rsa`)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN and shred receiver selection\n\n### Step 2: Geyser Plugin\nPresent options:\n- `Yellowstone gRPC` — Standard Geyser gRPC plugin (github.com/rpcpool/yellowstone-grpc)\n- `Richat` — Richat Geyser plugin (github.com/lamports-dev/richat) — higher throughput\n\nBased on selection, set the **required** version variable:\n- Yellowstone → `yellowstone_grpc_version` (required)\n- Richat → `richat_version` (required, e.g., `richat-v8.1.0`)\n\n**Do NOT collect both versions** — only the selected plugin's version is needed.\n\n### Step 3: RPC Type\n- `Geyser gRPC` — gRPC streaming only\n- `Index RPC + gRPC` — Full-index RPC + gRPC streaming (also needs faithful vars)\n\n### Step 4: Validator Type (underlying client)\n- `agave` — Standard Agave\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module (recommended for gRPC Geyser)\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 5: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected\n- `firedancer_version` — **Required** if firedancer selected\n\n### Step 6: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 7: Snapshot\n- `snapshot_url` — Snapshot download URL\n  - ERPC nodes: auto-detected via nearest snapshot node\n  - External: user provides URL, or use `run_snapshot_finder.yml`\n  - **Cannot be empty for init**\n\n### Step 8: gRPC Config\n- `port_grpc` — gRPC listen port (default: `10000`)\n- `port_rpc` — RPC listen p"},{"path":"skill-card.md","content":"## Description:\n\nAnsible playbooks and templates for deploying and managing Solana gRPC Geyser streaming nodes with Yellowstone or Richat plugins.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[poppin-fumi](https://clawhub.ai/user/poppin-fumi)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Solana infrastructure operators use this skill to plan, configure, and run Ansible workflows for deploying or maintaining gRPC Geyser streaming nodes, including Yellowstone gRPC or Richat plugin builds.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Remote administration playbooks can change node state, restart services, or affect production availability.\n\nMitigation: Run dry-run or check mode first, review planned variables and target hosts, and require change approval before production restarts or updates.\n\nRisk: Runtime playbooks are resolved from ~/.slv/template/ and may differ from the artifact's reference copies.\n\nMitigation: Review the resolved template directory and playbook path before execution, and install only from trusted SLV template sources.\n\nRisk: Automatic prerequisite setup may install packages or use elevated package-manager commands on the operator host.\n\nMitigation: Prefer manually installing pinned prerequisites, and review setup behavior before running automatic installation paths.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/poppin-fumi/skills/slv-grpc-geyser)\n- [Yellowstone gRPC](https://github.com/rpcpool/yellowstone-grpc)\n- [Richat](https://github.com/lamports-dev/richat)\n- [ERPC Snapshot Network](https://erpc.global/en/)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration]\n\n**Output Format:** [Markdown guidance with inline shell commands and YAML inventory examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces deployment guidance and command proposals; users should review before running commands on target hosts.]\n\n## Skill Version(s):\n\n0.13.15 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1740,"uniquenessScore":37,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:09:12.947Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:14:19.440Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}