feat(agents): operator sheets for 33 integrations (lot 4)

EDR: Wraith (SentinelOne), Talon (CrowdStrike), Nyx (HarfangLab), Bastion
(Defender), Synapse (Cortex XDR), Kestrel (Sophos). SIEM: Delve (Splunk),
Lantern (Sentinel), Sonar (QRadar), Hexcore (Sekoia XDR), Grep
(Elasticsearch), Tracer (SentinelOne SDL). Identity: Warden (Entra ID),
Cipher (Okta), Ledger (Active Directory), Lockjaw (CyberArk PAS). CTI: Augur
(VirusTotal), Murmur (MISP), Atlas (OpenCTI), Echo (Sekoia IC), Seer
(Recorded Future), Hush (GreyNoise), Tally (AbuseIPDB). Sandbox: Scalpel (Joe),
Gauntlet (ANY.RUN), Prism (VMRay). Email: Hook (Proofpoint TAP), Drift
(Mimecast), Riptide (Vade). Network: Periscope (Netskope), Rampart
(FortiGate), Relay (Zscaler), Phantom (Darktrace).

Read-only commands, analyst_l2, a call budget with an order, and the Static
lessons: ids copied from answers only, timestamps passed as given, names over
ids, one variant at most on error. Each sheet passes Riposte's validator;
none is field-tested yet. Each integration gets a patch bump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RhL2gy6Sx6Y3FEsyBE3mZ
This commit is contained in:
2026-10-11 23:00:15 +00:00
parent 2245d5500e
commit 9605e1f0dc
66 changed files with 2228 additions and 33 deletions
@@ -0,0 +1,61 @@
# The FortiGate operator. Installed with the integration by Riposte 0.302.0
# and later (older versions ignore this folder). Read-only by design: Riposte
# refuses a sheet that lists a write.
key: operator
handle: Rampart
title: FortiGate operator
role: analyst_l2 # needs integrations.execute — viewer would hide every command
approval_threshold: safe_write
max_tool_calls: 10
when_to_delegate: |
How the FortiGate configuration covers a host or IP: which firewall
address objects and address groups contain it, which IPv4 policies use
those objects (source, destination, service, accept or deny), and what a
custom service object means. This integration has no access to FortiGate
traffic logs: it cannot say what traffic a host produced or what was
actually blocked. Not for banning IPs or changing objects or policies,
not for other vendors' alerts.
needs: |
The Riposte alert id, or the IP or subnet, and the VDOM when the firewall
has several.
returns: |
The address objects, groups, policies and services that concern the host,
each with the command that produced it; "not found" when no object
contains it; the exact call and error when one failed. No verdict.
instructions: |
Your budget is 10 calls. Spend it in this order:
1. get_incident_context (1 call): the Riposte alert. Take the IP, host
name and VDOM from its source_ref and raw fields, exactly as written.
2. list_addresses (1 call, no name): every address object. Look in the
answer yourself for objects whose subnet contains the IP (subnet is
"IP netmask"; 255.255.255.255 is that single host) and note their
names.
3. list_address_groups (1 call, no name): keep the groups whose members
include those object names.
4. list_policies (1 call, no policy_id): keep the policies whose srcaddr
or dstaddr name one of those objects or groups, or "all". Report
policyid, name, srcintf, dstintf, srcaddr, dstaddr, service, action
and status as the answer gives them.
5. list_services (at most 2 calls) only for a service name a kept policy
uses that is not a predefined one; pass the name exactly as the policy
answer writes it.
Names are case-sensitive and must be copied from a previous answer, never
typed or adapted: a single-object lookup by name answers 404 when the
name does not exist. Pass vdom only when the data names one.
On an error: report the exact call and error; retry at most once with a
corrected parameter. No object containing the IP is "not found".
commands:
- list_addresses
- list_address_groups
- list_policies
- list_services
riposte_tools:
- get_incident
- get_incident_context