{"id":"bc431a2a-b55c-4f92-a173-be415decdede","entityType":"agent","slug":"clawhub-poppin-fumi-slv-rpc","name":"Slv Rpc","canonicalUrl":"https://www.xpersona.co/agent/clawhub-poppin-fumi-slv-rpc","canonicalPath":"/agent/clawhub-poppin-fumi-slv-rpc","generatedAt":"2026-10-10T08:54:13.433Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:16:27.097Z","emptyReason":null},"description":"Ansible playbooks and templates to deploy, manage, and update Solana RPC nodes on mainnet, testnet, and devnet with support for RPC, indexing, and gRPC.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-rpc","sourceUrl":"https://clawhub.ai/poppin-fumi/slv-rpc","homepage":"https://clawhub.ai/poppin-fumi/skills/slv-rpc","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/poppin-fumi/slv-rpc","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/poppin-fumi/skills/slv-rpc","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":55,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Slv Rpc 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-10T06:16:27.097Z","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-10T06:16:27.097Z","emptyReason":null},"stars":null,"forks":null,"downloads":1626,"packageName":null,"latestVersion":"0.13.15","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:16:27.096Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T06:16:27.097Z","lastCrawledAt":"2026-10-10T06:16:27.096Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T06:16:27.096Z","lastVerifiedAt":null,"highlights":[{"version":"0.13.15","createdAt":"2026-03-30T17:42:33.249Z","changelog":"No changes in files detected for version 0.13.15. - No updates, bugfixes, or new features in this release.","fileCount":7,"zipByteSize":12001},{"version":"0.13.14","createdAt":"2026-03-30T12:27:10.278Z","changelog":"No changes detected in this version. - No file changes or updates were made in v0.13.14.","fileCount":6,"zipByteSize":10617},{"version":"0.13.13","createdAt":"2026-03-27T20:35:01.501Z","changelog":"- Documentation updated in SKILL.md; no functional or code changes. - SKILL.md reformatted, but content remains the same. - No changes to core functionality or playbooks.","fileCount":6,"zipByteSize":10616},{"version":"0.13.12","createdAt":"2026-03-27T20:11:34.947Z","changelog":"slv-rpc version 0.13.12 - No file changes detected in this release. - Documentation, skill configuration, and features remain unchanged.","fileCount":6,"zipByteSize":9607},{"version":"0.13.11","createdAt":"2026-03-27T16:05:30.457Z","changelog":"No changes in this release (0.13.11). - No file changes detected. - No updates to playbooks, documentation, or functionality.","fileCount":6,"zipByteSize":9607},{"version":"0.13.9","createdAt":"2026-03-27T15:10:17.164Z","changelog":"Version 0.13.9 - No file changes detected in this release. - Documentation, playbooks, and CLI mapping remain the same as previous version.","fileCount":6,"zipByteSize":9606},{"version":"0.13.7","createdAt":"2026-03-27T13:26:12.535Z","changelog":"Version 0.13.7 of slv-rpc - No file changes detected in this release. - No updates to playbooks, templates, or documentation. - Behavior and capabilities remain unchanged from the previous version.","fileCount":6,"zipByteSize":9606},{"version":"0.13.6","createdAt":"2026-03-25T20:00:13.472Z","changelog":"Version 0.13.6 of slv-rpc - No file changes detected in this release. - Functionality and documentation remain unchanged from the previous version.","fileCount":6,"zipByteSize":9606}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-rpc","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17e81hsw278gv9pmpy6ys301n83kz2r:slv-rpc` 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-rpc 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-rpc/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/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-10T08:54:13.428Z"}},"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-rpc/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-poppin-fumi-slv-rpc/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-10T06:16:27.097Z","emptyReason":null},"readme":"Skill: Slv Rpc\n\nOwner: poppin-fumi\n\nSummary: Ansible playbooks and templates to deploy, manage, and update Solana RPC nodes on mainnet, testnet, and devnet with support for RPC, indexing, and gRPC.\n\nTags: ansible:0.9.962, blockchain:0.9.962, infrastructure:0.9.962, latest:0.13.15, rpc:0.9.962, solana:0.9.962\n\nVersion history:\n\nv0.13.15 | 2026-03-30T17:42:33.249Z | auto\n\nNo changes in files detected for version 0.13.15.\n\n- No updates, bugfixes, or new features in this release.\n\nv0.13.14 | 2026-03-30T12:27:10.278Z | auto\n\nNo changes detected in this version.\n\n- No file changes or updates were made in v0.13.14.\n\nv0.13.13 | 2026-03-27T20:35:01.501Z | auto\n\n- Documentation updated in SKILL.md; no functional or code changes.\n- SKILL.md reformatted, but content remains the same.\n- No changes to core functionality or playbooks.\n\nv0.13.12 | 2026-03-27T20:11:34.947Z | auto\n\nslv-rpc version 0.13.12\n\n- No file changes detected in this release.\n- Documentation, skill configuration, and features remain unchanged.\n\nv0.13.11 | 2026-03-27T16:05:30.457Z | auto\n\nNo changes in this release (0.13.11).  \n- No file changes detected.\n- No updates to playbooks, documentation, or functionality.\n\nv0.13.9 | 2026-03-27T15:10:17.164Z | auto\n\nVersion 0.13.9\n\n- No file changes detected in this release.\n- Documentation, playbooks, and CLI mapping remain the same as previous version.\n\nv0.13.7 | 2026-03-27T13:26:12.535Z | auto\n\nVersion 0.13.7 of slv-rpc\n\n- No file changes detected in this release.\n- No updates to playbooks, templates, or documentation.\n- Behavior and capabilities remain unchanged from the previous version.\n\nv0.13.6 | 2026-03-25T20:00:13.472Z | auto\n\nVersion 0.13.6 of slv-rpc\n\n- No file changes detected in this release.\n- Functionality and documentation remain unchanged from the previous version.\n\nv0.13.5 | 2026-03-25T19:02:17.717Z | auto\n\n- No file changes detected in this version.\n- Documentation (SKILL.md) remains unchanged.\n- No new features, fixes, or updates included.\n\nv0.13.4 | 2026-03-25T17:00:12.642Z | auto\n\n0.13.4\n\n- No file changes were detected in this version.\n- No updates or modifications to the skill contents.\n\nv0.13.1 | 2026-03-25T15:35:41.951Z | auto\n\nNo changes detected in this release.\n\n- Version bumped to 0.13.1 with no modifications to files or documentation content.\n\nv0.13.0 | 2026-03-25T14:27:56.384Z | auto\n\nNo changes detected in this release.\n\n- Version 0.13.0 was published without any file modifications. \n- No updates or new features introduced.\n\nv0.11.10 | 2026-03-20T12:12:08.045Z | auto\n\nVersion 0.11.10\n\n- No file changes detected in this release.\n- Documentation and supported features remain unchanged.\n\nv0.11.9 | 2026-03-19T17:40:46.917Z | auto\n\n0.11.9 — No changes detected in this release\n\n- No file changes were made compared to the previous version.\n- No updates, enhancements, or bugfixes to the SLV RPC skill contents.\n\nv0.11.8 | 2026-03-19T11:05:46.312Z | auto\n\nVersion 0.11.8 of slv-rpc\n\n- No file changes were detected in this version.\n- Functionality and documentation remain unchanged from the previous release.\n\nv0.11.7 | 2026-03-18T22:16:57.933Z | auto\n\nVersion 0.11.7 of slv-rpc\n\n- No file changes detected in this release.\n- Documentation and skill content remain unchanged.\n- No new features, bug fixes, or enhancements introduced.\n\nv0.11.6 | 2026-03-18T19:49:00.496Z | auto\n\nNo changes detected in this version.\n\n- Version updated to 0.11.6 with no file or documentation modifications.\n\nv0.11.5 | 2026-03-18T17:34:46.699Z | auto\n\nNo file or content changes detected in this release.\n\n- Version bump to 0.11.5 with no modifications to files or documentation.\n- No new features, bug fixes, or updates included in this version.\n\nv0.11.4 | 2026-03-18T16:52:49.001Z | auto\n\nVersion 0.11.4 of slv-rpc\n\n- No file changes detected in this release.\n- Functionality and documentation remain unchanged from the previous version.\n\nv0.11.3 | 2026-03-18T13:28:39.693Z | auto\n\nVersion 0.11.3 of the slv-rpc skill contains no changes to files.\n\n- No code or documentation changes detected in this release.\n\nv0.11.2 | 2026-03-17T18:27:11.778Z | auto\n\nslv-rpc version 0.11.2\n\n- No file changes detected in this release.\n- No user-facing, documentation, or code changes.\n- Behavior and features are unchanged from the previous version.\n\nv0.11.1 | 2026-03-17T17:20:40.940Z | auto\n\nNo file or documentation changes detected in this version.\n\n- No updates or changes introduced in version 0.11.1.\n\nv0.11.0 | 2026-03-17T16:09:22.866Z | auto\n\nNo file changes detected.  \n- Version bump to 0.11.0; no changes to code or documentation.  \n- No new features, fixes, or updates included in this release.\n\nv0.10.2 | 2026-02-24T16:44:37.051Z | auto\n\n- Removed the skill.json file from the repository.\n- No other changes to playbooks, documentation, or functionality.\n- Existing Ansible and Jinja2 structure, as well as documentation, remain unchanged.\n\nv0.9.962 | 2026-02-24T09:38:57.627Z | user\n\nInitial release: AI-powered Solana RPC node deployment. Playbooks at https://github.com/ValidatorsDAO/slv\n\nArchive index:\n\nArchive v0.13.15: 7 files, 12001 bytes\n\nFiles: AGENT.md (9013b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), skill-card.md (2521b), SKILL.md (10815b), _meta.json (128b)\n\nFile v0.13.15:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.15:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.15\",\n  \"publishedAt\": 1774892553249\n}\n\nFile v0.13.15:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\n- Run benchmark and connectivity checks for gRPC, ShredStream, and RPC endpoints\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\n5. **Interactive variable collection**: Guide users through required variables step by step\n6. **Benchmark tasks first ask type, then endpoints**: for benchmark requests, first determine `shredstream`, `grpc`, or `rpc`, then ask only for the endpoint(s) needed\n\n## Benchmark Flow\n\nFor benchmark requests, collect the minimum inputs in this order:\n\n### Step 1: Benchmark Type\nAsk exactly one question if the type is unclear:\n- `shredstream`\n- `grpc`\n- `rpc`\n\n### Step 2: Endpoint Inputs\nAfter the type is known, ask only for the endpoint inputs required to generate the benchmark config.\n\n- For `shredstream` or `grpc`:\n  - Ask for **two endpoint URLs** to compare\n  - Prefer running the local `geyserbench` binary if installed by `slv install`\n  - Use ERPC API key from `~/.slv/api.yml` if already configured\n  - If the ERPC API key is missing, tell the main agent to ask the user to obtain a free API key and configure `~/.slv/api.yml`\n- For `rpc`:\n  - Ask for the RPC endpoint(s) to check and use the most suitable local SLV check flow\n\n### Step 3: Generate `config.toml` for `geyserbench`\nFor `shredstream` / `grpc`, build a config like this:\n\n```toml\n[config]\nregion = \"frankfurt\"\nerpc_url = \"https://edge.erpc.global\"\nerpc_api_key = \"api-key\"\ntransactions = 10000\naccount = \"pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA\"\ncommitment = \"processed\"\n\n[[endpoint]]\nname = \"http://endpoint-1\"\nurl = \"http://endpoint-1\"\nkind = \"shredstream\"\n\n[[endpoint]]\nname = \"http://endpoint-2\"\nurl = \"http://endpoint-2\"\nkind = \"shredstream\"\n```\n\n- Replace `kind` with `grpc`-appropriate `yellowstone` when benchmarking gRPC endpoints.\n- Use the supplied URLs for both `name` and `url` unless a cleaner display name is helpful.\n- Generate the config file automatically once the two URLs are known.\n\n### Step 4: Execute benchmark\n- Prefer a future CLI flow like `slv check geyserbench <options>` when available.\n- Until then, if `geyserbench` is available locally, run it directly with the generated config and return the output with minimal rewriting.\n- Show the benchmark output directly to the user whenever possible.\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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\nGuides an agent through deploying, managing, updating, and benchmarking Solana RPC nodes across mainnet, testnet, and devnet using Ansible-based SLV workflows.\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 infrastructure operators use this skill to collect node parameters, generate inventories, and run or review Ansible commands for Solana RPC deployment, lifecycle management, plugin setup, and endpoint benchmarking.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can guide an agent to make real infrastructure changes to Solana RPC nodes.\n\nMitigation: Confirm the target server, generated inventory, selected playbook, and extra variables before execution; run Ansible check mode first when practical.\n\nRisk: Runtime playbooks may come from a mutable local template directory outside the reviewed package.\n\nMitigation: Verify the exact ~/.slv/template version, source, ownership, and contents before running playbooks; prefer pinned or checksummed playbooks.\n\nRisk: Some workflows may involve disk formatting, ledger cleanup, sudo package installation, or curl-to-shell installer steps.\n\nMitigation: Manually review these operations before approving them and ensure private keys, tokens, and credentials are never logged or embedded in generated files.\n\n## Reference(s):\n\n- [Slv Rpc on ClawHub](https://clawhub.ai/poppin-fumi/skills/slv-rpc)\n- [ERPC Snapshot Network](https://erpc.global/en/)\n- [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n- [Yellowstone gRPC](https://github.com/rpcpool/yellowstone-grpc)\n- [Richat](https://github.com/lamports-dev/richat)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and YAML configuration examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May generate Ansible inventory values and benchmark configuration snippets; recommends confirmation and dry-run before high-impact playbooks.]\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.14: 6 files, 10617 bytes\n\nFiles: AGENT.md (9013b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (128b)\n\nFile v0.13.14:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.14:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.14\",\n  \"publishedAt\": 1774873630278\n}\n\nFile v0.13.14:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\n- Run benchmark and connectivity checks for gRPC, ShredStream, and RPC endpoints\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\n5. **Interactive variable collection**: Guide users through required variables step by step\n6. **Benchmark tasks first ask type, then endpoints**: for benchmark requests, first determine `shredstream`, `grpc`, or `rpc`, then ask only for the endpoint(s) needed\n\n## Benchmark Flow\n\nFor benchmark requests, collect the minimum inputs in this order:\n\n### Step 1: Benchmark Type\nAsk exactly one question if the type is unclear:\n- `shredstream`\n- `grpc`\n- `rpc`\n\n### Step 2: Endpoint Inputs\nAfter the type is known, ask only for the endpoint inputs required to generate the benchmark config.\n\n- For `shredstream` or `grpc`:\n  - Ask for **two endpoint URLs** to compare\n  - Prefer running the local `geyserbench` binary if installed by `slv install`\n  - Use ERPC API key from `~/.slv/api.yml` if already configured\n  - If the ERPC API key is missing, tell the main agent to ask the user to obtain a free API key and configure `~/.slv/api.yml`\n- For `rpc`:\n  - Ask for the RPC endpoint(s) to check and use the most suitable local SLV check flow\n\n### Step 3: Generate `config.toml` for `geyserbench`\nFor `shredstream` / `grpc`, build a config like this:\n\n```toml\n[config]\nregion = \"frankfurt\"\nerpc_url = \"https://edge.erpc.global\"\nerpc_api_key = \"api-key\"\ntransactions = 10000\naccount = \"pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA\"\ncommitment = \"processed\"\n\n[[endpoint]]\nname = \"http://endpoint-1\"\nurl = \"http://endpoint-1\"\nkind = \"shredstream\"\n\n[[endpoint]]\nname = \"http://endpoint-2\"\nurl = \"http://endpoint-2\"\nkind = \"shredstream\"\n```\n\n- Replace `kind` with `grpc`-appropriate `yellowstone` when benchmarking gRPC endpoints.\n- Use the supplied URLs for both `name` and `url` unless a cleaner display name is helpful.\n- Generate the config file automatically once the two URLs are known.\n\n### Step 4: Execute benchmark\n- Prefer a future CLI flow like `slv check geyserbench <options>` when available.\n- Until then, if `geyserbench` is available locally, run it directly with the generated config and return the output with minimal rewriting.\n- Show the benchmark output directly to the user whenever possible.\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.13: 6 files, 10616 bytes\n\nFiles: AGENT.md (9013b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (128b)\n\nFile v0.13.13:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.13:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.13\",\n  \"publishedAt\": 1774643701501\n}\n\nFile v0.13.13:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\n- Run benchmark and connectivity checks for gRPC, ShredStream, and RPC endpoints\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\n5. **Interactive variable collection**: Guide users through required variables step by step\n6. **Benchmark tasks first ask type, then endpoints**: for benchmark requests, first determine `shredstream`, `grpc`, or `rpc`, then ask only for the endpoint(s) needed\n\n## Benchmark Flow\n\nFor benchmark requests, collect the minimum inputs in this order:\n\n### Step 1: Benchmark Type\nAsk exactly one question if the type is unclear:\n- `shredstream`\n- `grpc`\n- `rpc`\n\n### Step 2: Endpoint Inputs\nAfter the type is known, ask only for the endpoint inputs required to generate the benchmark config.\n\n- For `shredstream` or `grpc`:\n  - Ask for **two endpoint URLs** to compare\n  - Prefer running the local `geyserbench` binary if installed by `slv install`\n  - Use ERPC API key from `~/.slv/api.yml` if already configured\n  - If the ERPC API key is missing, tell the main agent to ask the user to obtain a free API key and configure `~/.slv/api.yml`\n- For `rpc`:\n  - Ask for the RPC endpoint(s) to check and use the most suitable local SLV check flow\n\n### Step 3: Generate `config.toml` for `geyserbench`\nFor `shredstream` / `grpc`, build a config like this:\n\n```toml\n[config]\nregion = \"frankfurt\"\nerpc_url = \"https://edge.erpc.global\"\nerpc_api_key = \"api-key\"\ntransactions = 10000\naccount = \"pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA\"\ncommitment = \"processed\"\n\n[[endpoint]]\nname = \"http://endpoint-1\"\nurl = \"http://endpoint-1\"\nkind = \"shredstream\"\n\n[[endpoint]]\nname = \"http://endpoint-2\"\nurl = \"http://endpoint-2\"\nkind = \"shredstream\"\n```\n\n- Replace `kind` with `grpc`-appropriate `yellowstone` when benchmarking gRPC endpoints.\n- Use the supplied URLs for both `name` and `url` unless a cleaner display name is helpful.\n- Generate the config file automatically once the two URLs are known.\n\n### Step 4: Execute benchmark\n- Prefer a future CLI flow like `slv check geyserbench <options>` when available.\n- Until then, if `geyserbench` is available locally, run it directly with the generated config and return the output with minimal rewriting.\n- Show the benchmark output directly to the user whenever possible.\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.12: 6 files, 9607 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (128b)\n\nFile v0.13.12:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.12:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.12\",\n  \"publishedAt\": 1774642294947\n}\n\nFile v0.13.12:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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-rpc/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.11: 6 files, 9607 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (128b)\n\nFile v0.13.11:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.11:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.11\",\n  \"publishedAt\": 1774627530457\n}\n\nFile v0.13.11:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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-rpc/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.9: 6 files, 9606 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (127b)\n\nFile v0.13.9:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedancer_version` | Firedancer version | — |\n| `yellowstone_grpc_version` | Yellowstone gRPC version | — |\n| `richat_version` | Richat plugin version (e.g. `richat-v8.1.0`) | — |\n| `snapshot_url` | Snapshot download URL | — |\n| `tpu_peer_address` | TPU peer address (for Index RPC transaction forwarding) | — |\n| `limit_ledger_size` | Ledger size limit | `200000000` (Index), `100000000` (others) |\n| `dynamic_port_range` | Port range | `8000-8025` |\n| `port_rpc` | RPC port | `8899` |\n| `port_grpc` | gRPC port | `10000` |\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\nansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'\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| `network` | \"mainnet, testnet, or devnet?\" | `mainnet`, `testnet`, `devnet` |\n| `region` | \"Server region?\" | String |\n| `rpc_type` | \"RPC type?\" | `RPC`, `Index RPC`, `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### Conditionally Required Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `jito_version` | Matches solana_version | jito/jito-bam types |\n| `firedancer_version` | — | firedancer types |\n| `yellowstone_grpc_version` | — | Yellowstone gRPC plugin |\n| `richat_version` | — | Richat plugin |\n| `of1_version` | — | Index RPC (Old Faithful) |\n| `epoch` | — | Index RPC (faithful service) |\n| `faithful_proxy_target_url` | — | Index RPC |\n\n### Optional Variables\n\n| Variable | Default | When Required |\n|---|---|---|\n| `ssh_user` | `solv` | Always |\n| `port_rpc` | `8899` (ERPC: `7211`) | Always |\n| `limit_ledger_size` | `100000000` | Always |\n| `dynamic_port_range` | `8000-8025` | Always |\n| `port_grpc` | `10000` | gRPC types only |\n| `tpu_peer_address` | — | Index RPC (tx forwarding) |\n| `allowed_ssh_ips` | — | Strongly recommended (UFW) |\n| `allowed_ips` | — | Optional (UFW) |\n| `expected_shred_version` | Epoch-dependent | Testnet only |\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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'\n```\n\nFile v0.13.9:README.md\n\n# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.9\",\n  \"publishedAt\": 1774624217164\n}\n\nFile v0.13.9:AGENT.md\n\n# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\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- `network` — `mainnet`, `testnet`, or `devnet` (required)\n- `region` — Server geographic region (e.g., `amsterdam`, `tokyo`) — affects CDN selection\n\n### Step 2: RPC Type\nPresent options:\n- `RPC` — Standard RPC node\n- `Index RPC` — Full-index RPC (with Old Faithful / yellowstone-faithful)\n- `Geyser gRPC` — RPC with Geyser gRPC streaming\n- `Index RPC + gRPC` — Full-index + gRPC streaming\n\n### Step 3: Validator Type (underlying client)\n- `agave` — Standard Agave (recommended for RPC)\n- `jito` — Jito MEV client\n- `jito-bam` — Jito with Block Awareness Module\n- `firedancer-agave` — Firedancer with Agave consensus\n\n### Step 4: Versions\n- `solana_version` — Solana/Agave version (required, default: `3.1.8`)\n- `jito_version` — **Required** if jito/jito-bam selected (typically matches solana_version)\n- `firedancer_version` — **Required** if firedancer selected\n- `yellowstone_grpc_version` — If Geyser gRPC selected (Yellowstone plugin)\n- `richat_version` — If Richat plugin selected (e.g., `richat-v8.1.0`)\n\n### Step 5: Keys & Identity\n- `identity_account` — Node identity pubkey (required for init)\n\n### Step 6: 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 7: RPC Config\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` for RPC)\n\n### Step 8: Network Security\n- `allowed_ssh_ips` — IPs allowed SSH access (strongly recommended)\n- `allowed_ips` — Additional firewall rules (optional)\n\n### Step 9: Index RPC specific (if rpc_type includes \"Index\")\n- `of1_version` — Old Faithful (faithful-cli) version\n- `epoch` — Faithful service target epoch\n- `faithful_proxy_target_url` — Faithful proxy target URL\n\n### Step 10: gRPC specific (if rpc_type includes \"gRPC\")\n- `port_grpc` — gRPC listen port (default: `10000`)\n- Choose plugin: Yellowstone gRPC or Richat\n- Set corresponding version variable\n\n### Step 11: Transaction forwarding (optional)\n- `tpu_peer_address` — TPU peer address for transaction forwarding (important for Index RPC)\n\n### Step 12: Testnet-specific (if network is testnet)\n- `expected_shred_version` — Epoch-dependent (required)\n- `rpc_type` variation — testnet uses `rpc.private` as default\n\n### Step 13: 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 {network}-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-rpc/ansible/\nansible-playbook -i /path/to/inventory.yml mainnet-rpc/init.yml -e '{...}'\n```\n\n## RPC Health Check & Slot Sync Monitoring\n\nAfter restarting or deploying an RPC 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. **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\n3. **Completion Criteria**:\n   - Slot difference < 100 AND `/health` returns `ok` → ✅ **Complete**\n   - 45 minute timeout → ⚠️ **Error / Manual intervention needed**\n\n4. **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 only.\n\n## Safety Rules\n\n- **NEVER run playbooks without user confirmation**\n- **NEVER store or log private keys**\n- **Always use `--check` (dry-run) first when uncertain**\n- **For Geyser plugin updates**: Confirm version compatibility with Solana version\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 RPC — Example Inventory\n#\n# Usage:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml\n#\n# Or with extra_vars:\n#   ansible-playbook -i inventory.yml mainnet-rpc/init.yml \\\n#     -e '{\"solana_version\":\"3.1.8\",\"rpc_type\":\"Geyser gRPC\"}'\n\nall:\n  hosts:\n    rpc-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: RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n    rpc_type: \"RPC\"\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    # jito_version: \"3.1.8\"\n    # firedancer_version: \"0.305.20104\"\n    # yellowstone_grpc_version: \"v2.2.1\"\n    # richat_version: \"richat-v8.1.0\"\n\n    # --- Snapshot ---\n    snapshot_url: \"\"\n\n    # --- Network ---\n    limit_ledger_size: 100000000\n    dynamic_port_range: \"8000-8025\"\n\n    # --- gRPC (when rpc_type includes gRPC) ---\n    # port_grpc: 10000\n\n    # --- Testnet Only ---\n    # expected_shred_version: \"\"\n\nArchive v0.13.7: 6 files, 9606 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (127b)\n\nFile v0.13.7:SKILL.md\n\n# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.yml` | Build Richat gRPC plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start-validator.sh from template |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `setup_firedancer.yml` | Setup Firedancer for RPC |\n| `setup-solv-service.yml` | Setup systemd service |\n| `start-solv-service.yml` | Start systemd service |\n| `setup_ufw.yml` | Configure UFW firewall |\n| `setup_logrotate.yml` | Setup log rotation |\n| `setup_norestart.yml` | Disable auto-restart |\n| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |\n| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |\n| `fail2ban_sshd.yml` | Setup fail2ban for SSH |\n| `allow_ufw.yml` | Add UFW allow rules |\n| `add_solv.yml` | Add solv user |\n| `copy_keys.yml` | Copy node keys |\n| `create-start-validator-sh.yml` | Generate start script from template |\n| `create-symlink.yml` | Create version symlinks |\n| `mount_disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `run_restarter.yml` | Run restarter script |\n| `run_snapshot_finder.yml` | Find and download best snapshot |\n\n### Testnet RPC (`testnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full testnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_firedancer.yml` | Update Firedancer |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n| `wget_snapshot.yml` | Download snapshot |\n\n### Devnet RPC (`devnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full devnet RPC initialization |\n| `restart_node.yml` | Restart node |\n| `start_node.yml` / `stop_node.yml` | Start/stop node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` / `install_jito.yml` | Build client from source |\n| `install_richat.yml` | Install Richat plugin |\n| `geyser_build.yml` | Build Yellowstone gRPC |\n| `geyser_richat_build.yml` | Build Richat plugin from source |\n| `update_geyser.yml` | Update Geyser plugin |\n| `update_startup_config.yml` | Update start script |\n| `setup_firedancer.yml` | Setup Firedancer |\n| `setup_solv_service.yml` | Setup systemd service |\n| `create-start-validator-sh.yml` | Generate start script |\n\n### Shared Common (`cmn/`)\n\n| Playbook | Description |\n|---|---|\n| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |\n| `build_agave.yml` | Build Agave from GitHub source |\n| `build_jito.yml` | Build Jito from GitHub source |\n| `install_solana.yml` | Install Solana binary (deprecated) |\n| `install_package.yml` | Install system packages |\n| `install_rust.yml` | Install Rust toolchain |\n| `mount_disks.yml` / `mount-disks.yml` | Mount and format disks |\n| `optimize_system.yml` | Optimize system settings |\n| `disable_swap.yml` | Disable swap |\n| `setup_logrotate.yml` | Configure log rotation |\n| `setup_node_exporter.yml` | Setup Prometheus node exporter |\n| `setup_norestart.yml` | Disable auto-restart |\n| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |\n| `restart_solv.yml` | Restart solv service |\n| `start_solv.yml` / `stop_solv.yml` | Start/stop solv service |\n| `start_firedancer.yml` / `stop_firedancer.yml` | Start/stop Firedancer |\n| `copy_restart_sh.yml` | Copy restarter script |\n| `copy_rpc_keys.yml` | Copy RPC keys |\n| `update_ubuntu.yml` | Update Ubuntu packages |\n| `wget_snapshot.yml` | Download snapshot |\n| `add_solv.yml` | Add solv user |\n| `fix_permissions.yml` | Fix file permissions |\n\n## Key Variables (extra_vars)\n\n| Variable | Description | Default |\n|---|---|---|\n| `rpc_type` | RPC node type (`RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`) | `RPC` |\n| `validator_type` | Client type (`agave`, `jito`, `firedancer-agave`, `firedancer-jito`) | — |\n| `solana_version` | Solana/Agave version | — |\n| `jito_version` | Jito version | — |\n| `firedan\n\nArchive v0.13.6: 6 files, 9606 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (127b)\n\nArchive v0.13.5: 6 files, 9606 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (127b)\n\nArchive v0.13.4: 6 files, 9606 bytes\n\nFiles: AGENT.md (6546b), examples/inventory.yml (1105b), README.md (2033b), scripts/setup.sh (3382b), SKILL.md (10815b), _meta.json (127b)","readmeExcerpt":"Skill: Slv Rpc Owner: poppin-fumi Summary: Ansible playbooks and templates to deploy, manage, and update Solana RPC nodes on mainnet, testnet, and devnet with support for RPC, indexing, and gRPC. Tags: ansible:0.9.962, blockchain:0.9.962, infrastructure:0.9.962, latest:0.13.15, rpc:0.9.962, solana:0.9.962 Version history: v0.13.15 | 2026-03-30T17:42:33.249Z | auto No changes in files detected for version 0.13.15. - N","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"ansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates"},{"language":"bash","snippet":"ansible-playbook -i inventory mainnet-rpc/init.yml \\\n  -e '{\"rpc_type\":\"Index RPC\",\"solana_version\":\"3.1.8\",\"snapshot_url\":\"https://...\"}'"},{"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-rpc/ansible/\nansible-playbook -i inventory.yml {network}-rpc/init.yml \\\n  -e '{\"rpc_type\":\"<type>\",\"solana_version\":\"<version>\"}'"},{"language":"bash","snippet":"openclaw skill install slv-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"# SLV RPC Skill\n\nAnsible playbooks and Jinja2 templates for deploying and managing Solana RPC nodes (mainnet, testnet, devnet).\n\n## Supported RPC Types\n\n| Type | Description |\n|---|---|\n| `RPC` | Standard RPC node |\n| `Index RPC` | Full-index RPC node (with Old Faithful/yellowstone-faithful) |\n| `Geyser gRPC` | RPC with Geyser gRPC streaming |\n| `Index RPC + gRPC` | Full-index + gRPC streaming |\n\n## Directory Structure\n\n```\nansible/\n  mainnet-rpc/   — Mainnet RPC playbooks\n  testnet-rpc/   — Testnet RPC playbooks\n  devnet-rpc/    — Devnet RPC playbooks\n  cmn/           — Shared common playbooks\njinja/\n  mainnet-rpc/   — Mainnet Jinja2 templates\n  testnet-rpc/   — Testnet Jinja2 templates\n  devnet-rpc/    — Devnet Jinja2 templates\n  cmn/           — Shared templates\n```\n\n## CLI Command ↔ Playbook Mapping\n\nThe `slv r` CLI commands map directly to these playbooks. `{net}` = `mainnet-rpc`, `testnet-rpc`, or `devnet-rpc`.\n\n| CLI Command | Playbook | Description |\n|---|---|---|\n| `slv r deploy` | `{net}/init.yml` | Full RPC node initialization and deployment |\n| `slv r start` | `{net}/start_node.yml` | Start RPC node |\n| `slv r stop` | `{net}/stop_node.yml` | Stop RPC node |\n| `slv r restart` | `{net}/restart_node.yml` | Restart RPC node |\n| `slv r build:solana` | `{net}/install_solana.yml` | Build Solana from source |\n| `slv r install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |\n| `slv r setup:firedancer` | `{net}/setup_firedancer.yml` | Setup Firedancer |\n| `slv r update:firedancer` | `cmn/update_firedancer.yml` | Update Firedancer binary |\n| `slv r update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |\n| `slv r update:geyser` | `{net}/update_geyser.yml` | Update Geyser plugin |\n| `slv r get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |\n| `slv r cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |\n| `slv r list` | *(no playbook)* | List RPC nodes (CLI only) |\n| `slv r update:allowed-ips` | *(no playbook)* | Update allowed IPs (CLI only) |\n| `slv r init` | *(no playbook)* | Interactive wizard (CLI only) |\n\n## All Playbooks\n\n### Mainnet RPC (`mainnet-rpc/`)\n\n| Playbook | Description |\n|---|---|\n| `init.yml` | Full RPC node initialization |\n| `init_richat_geyser.yml` | Initialize Richat Geyser configuration |\n| `restart_node.yml` | Restart RPC node |\n| `start_node.yml` | Start RPC node |\n| `stop_node.yml` | Stop RPC node |\n| `install_solana.yml` | Build Solana from source |\n| `install_agave.yml` | Build Agave from source |\n| `install_jito.yml` | Build Jito from source |\n| `install_rust.yml` | Install Rust toolchain |\n| `install_package.yml` | Install system packages |\n| `install_richat.yml` | Install Richat gRPC plugin |\n| `install_of1.yml` | Install Old Faithful (yellowstone-faithful) |\n| `install_of1_service.yml` | Setup Old Faithful systemd service |\n| `geyser_build.yml` | Build Yellowstone gRPC from source |\n| `geyser_richat_build.y"},{"path":"README.md","content":"# SLV RPC Skill\n\nDeploy and manage Solana RPC nodes (mainnet, testnet, devnet) with AI-powered interactive guidance.\n\n## What This Does\n\nThis skill gives an AI agent the knowledge and tools to:\n- **Deploy** Solana RPC nodes with guided setup\n- **Manage** node lifecycle — start, stop, restart, update\n- **Configure** multiple RPC types in a single skill\n- **Build** Solana from source (Agave, Jito, Firedancer)\n- **Install** Geyser plugins (Yellowstone gRPC, Richat)\n- **Setup** Old Faithful for full-index RPC\n\nSupported RPC types: `RPC`, `Index RPC`, `Geyser gRPC`, `Index RPC + gRPC`\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-rpc\n\n# \"Deploy a mainnet Index RPC 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\":\"Index RPC\",\"solana_version\":\"3.1.8\"}'\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/        — Mainnet playbooks\n  testnet-rpc/        — Testnet playbooks\n  devnet-rpc/         — Devnet playbooks\n  cmn/                — Shared playbooks\njinja/\n  mainnet-rpc/        — Mainnet config templates\n  testnet-rpc/        — Testnet config templates\n  devnet-rpc/         — Devnet 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-rpc\",\n  \"version\": \"0.13.15\",\n  \"publishedAt\": 1774892553249\n}"},{"path":"AGENT.md","content":"# SLV RPC Agent\n\n## Identity\n\nYou are a **Solana RPC node deployment specialist**. You manage mainnet, testnet, and devnet\nRPC nodes using Ansible playbooks and the `slv` CLI.\n\n## Core Capabilities\n\n- Deploy new Solana RPC nodes (mainnet/testnet/devnet)\n- Manage RPC lifecycle (start, stop, restart, update)\n- Configure RPC types: Standard RPC, Index RPC, Geyser gRPC, Index RPC + gRPC\n- Build Solana from source (Agave, Jito, Firedancer)\n- Manage Geyser plugins (Yellowstone, Richat)\n- Configure Old Faithful (yellowstone-faithful) for Index RPC\n- Run benchmark and connectivity checks for gRPC, ShredStream, and RPC endpoints\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 ledger cleanup\n3. **Validate inputs**: Check IP format, version format, RPC type before proceeding\n4. **Explain what you're doing**: Before running any playbook, state which playbook and variables\n5. **Interactive variable collection**: Guide users through required variables step by step\n6. **Benchmark tasks first ask type, then endpoints**: for benchmark requests, first determine `shredstream`, `grpc`, or `rpc`, then ask only for the endpoint(s) needed\n\n## Benchmark Flow\n\nFor benchmark requests, collect the minimum inputs in this order:\n\n### Step 1: Benchmark Type\nAsk exactly one question if the type is unclear:\n- `shredstream`\n- `grpc`\n- `rpc`\n\n### Step 2: Endpoint Inputs\nAfter the type is known, ask only for the endpoint inputs required to generate the benchmark config.\n\n- For `shredstream` or `grpc`:\n  - Ask for **two endpoint URLs** to compare\n  - Prefer running the local `geyserbench` binary if installed by `slv install`\n  - Use ERPC API key from `~/.slv/api.yml` if already configured\n  - If the ERPC API key is missing, tell the main agent to ask the user to obtain a free API key and configure `~/.slv/api.yml`\n- For `rpc`:\n  - Ask for the RPC endpoint(s) to check and use the most suitable local SLV check flow\n\n### Step 3: Generate `config.toml` for `geyserbench`\nFor `shredstream` / `grpc`, build a config like this:\n\n```toml\n[config]\nregion = \"frankfurt\"\nerpc_url = \"https://edge.erpc.global\"\nerpc_api_key = \"api-key\"\ntransactions = 10000\naccount = \"pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA\"\ncommitment = \"processed\"\n\n[[endpoint]]\nname = \"http://endpoint-1\"\nurl = \"http://endpoint-1\"\nkind = \"shredstream\"\n\n[[endpoint]]\nname = \"http://endpoint-2\"\nurl = \"http://endpoint-2\"\nkind = \"shredstream\"\n```\n\n- Replace `kind` with `grpc`-appropriate `yellowstone` when benchmarking gRPC endpoints.\n- Use the supplied URLs for both `name` and `url` unless a cleaner display name is helpful.\n- Generate the config file automatically once the two URLs are known.\n\n### Step 4: Execute benchmark\n- Prefer a future CLI flow like `slv check geyserbench <options>` when available.\n- Until then, if `geyserbench` is available locally, run it directly with the generated config and return the "},{"path":"skill-card.md","content":"## Description:\n\nGuides an agent through deploying, managing, updating, and benchmarking Solana RPC nodes across mainnet, testnet, and devnet using Ansible-based SLV workflows.\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 infrastructure operators use this skill to collect node parameters, generate inventories, and run or review Ansible commands for Solana RPC deployment, lifecycle management, plugin setup, and endpoint benchmarking.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can guide an agent to make real infrastructure changes to Solana RPC nodes.\n\nMitigation: Confirm the target server, generated inventory, selected playbook, and extra variables before execution; run Ansible check mode first when practical.\n\nRisk: Runtime playbooks may come from a mutable local template directory outside the reviewed package.\n\nMitigation: Verify the exact ~/.slv/template version, source, ownership, and contents before running playbooks; prefer pinned or checksummed playbooks.\n\nRisk: Some workflows may involve disk formatting, ledger cleanup, sudo package installation, or curl-to-shell installer steps.\n\nMitigation: Manually review these operations before approving them and ensure private keys, tokens, and credentials are never logged or embedded in generated files.\n\n## Reference(s):\n\n- [Slv Rpc on ClawHub](https://clawhub.ai/poppin-fumi/skills/slv-rpc)\n- [ERPC Snapshot Network](https://erpc.global/en/)\n- [ValidatorsDAO/slv](https://github.com/ValidatorsDAO/slv)\n- [Yellowstone gRPC](https://github.com/rpcpool/yellowstone-grpc)\n- [Richat](https://github.com/lamports-dev/richat)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and YAML configuration examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May generate Ansible inventory values and benchmark configuration snippets; recommends confirmation and dry-run before high-impact playbooks.]\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":1734,"uniquenessScore":36,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T06:16:27.097Z","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-10T06:16:27.097Z","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-10T08:54:13.433Z","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"}]}}}