{"id":54730,"plugin_id":"plugin_asdk_app_6a8061659144819197910ef2762afbc0","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-25T12:04:51.323Z","digest":"b4cb1d41f200e9c4da5ed0f34f9cc3585f122f5100ef6b2a0c2d46baeb4744f8","against":null,"payload":{"description":"Gateway discovery and recovery. Current typed discovery, host-probe, reboot, update, and bounded shell fallback discipline.","included_files":[],"name":"discovery-and-recovery","skill_md_contents":"---\nname: discovery-and-recovery\ndescription: \"Gateway discovery and recovery. Current typed discovery, host-probe, reboot, update, and bounded shell fallback discipline.\"\n---\n\n<!-- Generated by scripts/build-openai-plugin.ts from workers/api/src/mcp/guidance.ts. Do not edit by hand. -->\n\n# Gateway discovery and recovery\n\n## Current capability map\n\n### SSH provisioning recovery\n\n- Available: get_server_auth_status returns only the authenticated account's password-attempt state and Gateway-key verification history for one owned server.\n- When password authentication is permanently disabled, do not retry it. Have the user install the server's Gateway public key through a trusted console or existing access path, then call verify_ssh_key.\n- Target-wide pressure, other customers' activity, risk scores, and internal thresholds are deliberately unavailable.\n\n### Filesystem discovery and reads\n\n- Available: stat_file and hash_file for exact paths; list_directory and find_files for bounded discovery without following links; search_file_contents for bounded UTF-8 literal or regex search; and read_file with bounded offset or stable cursor paging.\n- Keep roots, depth, result count, per-file bytes, and total bytes explicit. A read cursor is bound to file identity, size, and modification time and fails closed if the file changes.\n- Opt-in proactive detection: read get_file_scanning_preferences, then use scan_server_file only when allow_server_file_scanning=true. Gateway enforces that preference and routes an expected-hash regular file through its internal asynchronous transfer scanner; destructive response remains a separate authority.\n\n### Docker introspection\n\n- Available: list_docker_containers, inspect_docker_image, inspect_docker_container, get_docker_container_stats, exact container start/stop/restart and bounded logs, plus the advertised Compose tools.\n- exec_docker_container accepts a bounded argv vector for one exact running container. copy_from_docker_container and copy_to_docker_container copy one exact regular file and refuse an existing destination; overwrite cannot be enabled.\n\n### systemd discovery\n\n- Available: list_systemd_units, list_failed_systemd_units, and list_systemd_unit_files for bounded discovery; get_systemd_status, get_systemd_logs, get_systemd_dependencies, and allowlisted get_systemd_properties for exact units; plus daemon-reload and exact start/stop/restart/reload/try-reload/enable/disable/mask/unmask/reset-failed/kill tools. try_reload_systemd_unit never restarts an inactive or non-reloadable unit.\n\n### Host-originated probes\n\n- Available from the registered host: probe_tcp_from_host, request_http_from_host, inspect_tls_from_host, ping_from_host, and tracepath_from_host. Each accepts one exact destination and fixed bounds; HTTP does not follow redirects and TLS uses the host trust store.\n- is_up, wait_until_up, and wait_until_down remain executor-originated checks of the registered server endpoint. Keep the probe origin explicit when interpreting evidence.\n\n### Guarded reboot and update recovery\n\n- Available: get_update_status, refresh_package_updates, exact package operations, update_system_packages, get_reboot_required, get_services_restart_required, and reboot_system_guarded.\n- update_system_packages refuses package removals and never reboots. reboot_system_guarded observes SSH down/up, reconnects through pinned SSH trust and the leased identity, verifies a changed boot ID, and runs fixed post-boot health checks. Follow both as durable jobs to a terminal result.\n\n### Firewalls and connection addresses\n\n- A connection that times out or is refused before SSH negotiation starts often means a firewall, security group, or allowlist in front of the server is dropping or rejecting Gateway's connection.\n- Such a failed job carries connectionFailure: connectFrom lists the addresses Gateway connected from for that server's region, and staticIp gives the account's static IP state there (active, pending, slot_available, or none). inspect_region reports the same staticIp state for a shared region without a failure first.\n- Shared region addresses can change when a region moves to new infrastructure.\n- An account can hold a fixed address per region, dedicated to that account and not shared (Gateway docs, section static-ip). With one active, Gateway always connects from that address in that region. A server reached through a Gateway overlay network or a Private Region does not connect from region addresses.\n\n### Plan limits\n\n- A result that a plan limit refused or adjusted carries a constraint: what happened, why (the plan, its limit, and current usage), how it can be resolved (including ways that cost nothing), and an informational docs link. Its message is written to be shown to the user as is.\n- get_account_limits reports current usage and limits up front: servers, jobs running at once, the longest job, on-demand file scans today, and cloud storage. For example, pick a job timeout within the longest job the account allows.\n\n## execute_command fallback discipline\n\nInspect the server's advertised tools first. Use execute_command only when no exact typed capability covers the step, with an exact server and absolute shell, bounded read scope or mutation target, explicit timeout, and bounded output. Follow every returned durable job to its required terminal state. Repeated fallback friction is a request for a future typed operation, not evidence that one already exists.\n\n## Deliberate non-goals\n\nKeep staged Gateway/R2 transit as the normal private-artifact path at or below the 5,363,466,240-byte (4.995 GiB) single-part ceiling. Use copy_between_servers only for its bounded direct host-to-host path; Gateway must not relay its payload. sync_between_servers retains its existing staged default and explicit transport choices. Keep execute_command as the bounded escape hatch. Do not create a permanent known-clean database, call an unknown hash safe, synchronously gate every new artifact on heavyweight scanning, or expose a global malicious corpus to an agent or user.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}