Swarmchasing Report a swarm

Passive detection · coordinated disclosure · an open method

Swarmchasing

Swarmchasing finds AI agent activity in public records, links it into runs and fleets, and reports each confirmed incident that harms or endangers others to the AI provider responsible and the affected operators. A public notice follows: indicators first, naming no one affected, then names after 3 working days (10 if compromised).

See the method, walked through one synthetic incident below, or read the Field Manual.

No notices published yet.

The method, on one synthetic incident

Synthetic example. Every record on this page was written to show the method; none was collected. Target hosts are reserved placeholders (*.example) and networks are documentation ASNs. 48 records, 48 flagged, 10 clusters.

  1. Step 1

    Unwrap

    Agents fetch pages through readers, relays and code runners, so the URL a scan service records is often a wrapper. Each one is peeled into layers (relay paths, URL-valued parameters, base64, data: programs) down to the real target. The text is decoded, never opened.

    SC-FM FM-4.1 · FM-14.14

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: the layers inside one recorded URLsubmitted · layer 0hxxps://r[.]jina[.]ai/hxxps://q0[.]transit-authority[.]example/schedule?uqtag=ag2y&hook=hx…path · layer 1hxxps://q0[.]transit-authority[.]example/schedule?uqtag=ag2y&hook=hxxps://webhook[.]sit…param:hook · layer 2hxxps://webhook[.]site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f
    One synthetic URL, 3 layers deep, outermost first. Text is defanged and cut to fit.
    View as table
    LayerFound viaText (defanged)
    0submittedhxxps://r[.]jina[.]ai/hxxps://q0[.]transit-authority[.]example/schedule?uqtag=ag2y&hook=hxxps://webhook[.]site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f
    1pathhxxps://q0[.]transit-authority[.]example/schedule?uqtag=ag2y&hook=hxxps://webhook[.]site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f
    2param:hookhxxps://webhook[.]site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f
  2. Step 2

    Match

    The indicator rules run on every layer, and each counts once per record. Rules that read the same artifact (one program, one fetch route, one tag) share an independence group, which counts once, at its heaviest rule that fired. Context hits (relays, cache-busters, self-identification, headers, outcomes) together count at most 2, one below suggestive, so context alone is never enough. The score grades the record suggestive at 3 and significant at 6, and some rules are significant on their own. This record is graded significant.

    hxxps://r[.]jina[.]ai/hxxps://q0[.]transit-authority[.]example/schedule?uqtag=ag2y&hook=hxxps://webhook[.]site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f

    SC-FM FM-4.2 · FM-4.11 · FM-4.3

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: one record's score contributions against the thresholdsexfil.webhook_site +3+3marker.uq_tags +3+3relay.jina +2+2header.scripted_ua: 1 not counted (context cap)suggestive ≥ 3significant ≥ 6score 8 (+1 fired, not counted: dashed)exfil.webhook_site +3marker.uq_tags +3relay.jina +2header.scripted_ua +0 · 1 not counted: context cap
    Score 8 from 4 rules, whose weights add to 9. One segment per contribution; weight that fired but does not count is dashed. The tactic (SC-T) says what the match shows the agent doing.
    View as table
    RuleWeightGroupCounts asTacticMatched (defanged)
    relay.jina+2relaycontextT1r.jina.ai
    exfil.webhook_site+3–evidenceT7webhook.site/5e8d2c40-3333-4d1e-8f77-6a5b4c3d2e1f
    marker.uq_tags+3run_tagevidence–uqtag=ag2y
    header.scripted_ua+1–context–python-httpx
  3. Step 4

    Time

    Each cluster's records fall into runs: stretches of activity without a long pause. Runs give pace, rhythm and concurrency, and they are where agents show they act on each other: one run writing what another reads, runs starting together, a reader mapping hosts before a striker attacks them. Those are interaction hints (S1 to S6), each weak alone; a swarm claim needs several and review.

    SC-FM FM-5.5 · FM-6.2 · FM-5.12

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: runs of each cluster over time, UTC09-14 08:0709-14 15:5309-14 23:4009-15 07:2709-15 15:14C1C2C3C4C5C6C7C8C9C10C1: 2026-09-14 09:30:00 UTC to 2026-09-14 09:35:00 UTC, 6 record(s)C2: 2026-09-14 14:30:00 UTC to 2026-09-14 14:34:00 UTC, 5 record(s)C3: 2026-09-15 15:10:00 UTC to 2026-09-15 15:14:00 UTC, 5 record(s)C4: 2026-09-14 11:25:00 UTC to 2026-09-14 11:27:30 UTC, 3 record(s)C5: 2026-09-15 09:40:00 UTC to 2026-09-15 09:41:00 UTC, 2 record(s)C6: 2026-09-14 08:07:10 UTC to 2026-09-14 08:13:00 UTC, 8 record(s)C7: 2026-09-14 08:07:50 UTC to 2026-09-14 08:13:40 UTC, 8 record(s)C8: 2026-09-14 14:00:00 UTC to 2026-09-14 14:04:00 UTC, 5 record(s)C9: 2026-09-14 11:00:00 UTC to 2026-09-14 11:02:00 UTC, 3 record(s)C10: 2026-09-14 17:16:00 UTC to 2026-09-14 17:18:00 UTC, 2 record(s)

    significant suggestive pause

    S1 shared sinkS2 hand-offS4 role sequenceS5 disjoint partition

    Synthetic example: runs and the interaction hints between them09-14 08:1009-14 09:4509-14 11:2109-14 12:5609-14 14:32C1C9C4C8C2C6C7S1 shared sink (moderate): C1#1 (direct · Mozilla/5.0 (X11; Linux x86_64) HeadlessChrome/124.0 · AS64496) → C1#1 (relay.jina → target · python-httpx/0.27.0 · AS64497)S2 hand-off (strong): C9#1 → C4#1S4 role sequence (moderate): C8#1 → C2#1S5 disjoint partition (moderate): C6#1 → C7#1C1#1 (direct · Mozilla/5.0 (X11; Linux x86_64) HeadlessChrome/124.0 · AS64496)C1#1 (relay.jina → target · python-httpx/0.27.0 · AS64497)C9#1C4#1C8#1C2#1C6#1C7#1
    Top: one lane per cluster, one bar per run. Bottom: runs as dots and the 4 interaction hints between them, by kind (S1, S2, S4, S5).
    View the runs as a table
    ClusterTierRun startRun endRecords
    C1significant2026-09-14 09:30:00 UTC2026-09-14 09:35:00 UTC6
    C2significant2026-09-14 14:30:00 UTC2026-09-14 14:34:00 UTC5
    C3significant2026-09-15 15:10:00 UTC2026-09-15 15:14:00 UTC5
    C4significant2026-09-14 11:25:00 UTC2026-09-14 11:27:30 UTC3
    C5significant2026-09-15 09:40:00 UTC2026-09-15 09:41:00 UTC2
    C6suggestive2026-09-14 08:07:10 UTC2026-09-14 08:13:00 UTC8
    C7suggestive2026-09-14 08:07:50 UTC2026-09-14 08:13:40 UTC8
    C8suggestive2026-09-14 14:00:00 UTC2026-09-14 14:04:00 UTC5
    C9suggestive2026-09-14 11:00:00 UTC2026-09-14 11:02:00 UTC3
    C10suggestive2026-09-14 17:16:00 UTC2026-09-14 17:18:00 UTC2
    View the interaction hints as a table
    HintStrengthFromToChance
    S1 shared sinkmoderateC1#1 (direct · Mozilla/5.0 (X11; Linux x86_64) HeadlessChrome/124.0 · AS64496)C1#1 (relay.jina → target · python-httpx/0.27.0 · AS64497)–
    S2 hand-offstrongC9#1C4#1–
    S4 role sequencemoderateC8#1C2#11.1e-3
    S5 disjoint partitionmoderateC6#1C7#16.2e-4
  4. Step 5

    Grade agent likelihood

    A detected cluster is not yet an agent: a person pasting model output, or a scanner, can leave the same records. Each cluster gets a rung on a ladder from L0 (attack payloads only) to L4 (adaptive, model-written requests at a pace beyond one person); only case work reaches L5. Caps hold a grade down when the evidence cannot show more, such as archive capture times, which say nothing of pace. unmeasured on held-out data

    SC-FM FM-7.10 · FM-14.7

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: each cluster's agent-likelihood gradeL0payloads onlyL1self-describedL2model-writtenL3adaptiveL4agent likelyL5documentedC1: L1C1C2: L1C2C3: L1C3C4: L1C4C5: L2C5C6: L1C6C7: L1C7C8: L1C8C9: L1C9C10: L3C10
    A dot per cluster at its grade, coloured by tier. Descriptive: the grade is never scored, never linked on, and is not yet measured against held-out labels.
    View as table
    ClusterGradeSignalsCaps
    C1L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C2L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C3L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C4L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C5L2 model-writtenmodel-output residue in requests
    C6L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C7L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C8L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)capture times only: pace, retries and rhythm cannot be read, so the grade stops at L2
    C9L1 self-describednames a model or vendor, or carries an agent test tag (anyone can write this)
    C10L3 adaptivemodel-output residue in requests; a route escalation to reach one page
  5. Step 6

    Assess scope

    A tier measures payloads and tool use; a grade, how likely an agent is. Neither says the activity went beyond its task. Each cluster answers four separate questions: is a payload present (observed), is an agent present, is it out of scope (an inference from seven tests: off-task targets, getting past a block, sensitive paths, unsanctioned probing, identities and credentials, data sent out, coordination that widens any of them), and is it coordinated. Tool use alone fails no test: a fetch program through an echo service is how agents read, not misbehaviour. Here 4 clusters with a payload present are in scope.

    Agent likely (L4+) reads yes only from L4 on the grade ladder: adaptive, model-written requests at a pace or scale beyond one person. The rungs below it (L1 a model or tag named, L2 model-written text, L3 requests that change with the responses) say what the records carry, not that an agent sent them. None of the synthetic clusters reaches L4, so the column reads no throughout: L4 needs a pace or scale signal (machine pace, fan-out over many targets, several services, activity round the clock), and these runs are short and small, written to show the other steps.

    SC-FM FM-15.1 · FM-15.3 · FM-15.4

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: each cluster's four questions and scope testsFOUR QUESTIONSSCOPE TESTSFINDINGPayloadAgent (L4+)Out of scopeCoordinatedS1S2S3S4S5S6S7C1C1: Payload yesC1: Agent (L4+) noC1: Out of scope yesC1: Coordinated yesC1: S1 passC1: S2 passC1: S3 passC1: S4 passC1: S5 passC1: S6 failC1: S7 failscope exceededC2C2: Payload yesC2: Agent (L4+) noC2: Out of scope yesC2: Coordinated yesC2: S1 not assessableC2: S2 passC2: S3 passC2: S4 failC2: S5 passC2: S6 passC2: S7 failscope exceededC3C3: Payload yesC3: Agent (L4+) noC3: Out of scope yesC3: Coordinated noC3: S1 not assessableC3: S2 passC3: S3 passC3: S4 failC3: S5 passC3: S6 passC3: S7 not assessablescope exceededC4C4: Payload yesC4: Agent (L4+) noC4: Out of scope yesC4: Coordinated yesC4: S1 passC4: S2 passC4: S3 passC4: S4 failC4: S5 passC4: S6 passC4: S7 failscope exceededC5C5: Payload yesC5: Agent (L4+) noC5: Out of scope yesC5: Coordinated noC5: S1 failC5: S2 passC5: S3 passC5: S4 failC5: S5 failC5: S6 passC5: S7 not assessablescope exceededC6C6: Payload yesC6: Agent (L4+) noC6: Out of scope noC6: Coordinated yesC6: S1 passC6: S2 passC6: S3 passC6: S4 passC6: S5 passC6: S6 passC6: S7 not assessablein scopeC7C7: Payload yesC7: Agent (L4+) noC7: Out of scope noC7: Coordinated yesC7: S1 passC7: S2 passC7: S3 passC7: S4 passC7: S5 passC7: S6 passC7: S7 not assessablein scopeC8C8: Payload yesC8: Agent (L4+) noC8: Out of scope noC8: Coordinated yesC8: S1 passC8: S2 passC8: S3 passC8: S4 passC8: S5 passC8: S6 passC8: S7 not assessablein scopeC9C9: Payload yesC9: Agent (L4+) noC9: Out of scope noC9: Coordinated yesC9: S1 passC9: S2 passC9: S3 passC9: S4 passC9: S5 passC9: S6 passC9: S7 not assessablein scopeC10C10: Payload yesC10: Agent (L4+) noC10: Out of scope yesC10: Coordinated noC10: S1 passC10: S2 failC10: S3 passC10: S4 passC10: S5 passC10: S6 passC10: S7 not assessablescope exceeded

    payload present (observed) out of scope (inferred) test failed passed not assessable

    A row per cluster. An inference for review: the finding never changes a score, a tier or a link, and the admin decides the incident.
    View as table
    ClusterTierPayloadAgent likely (L4+)Out of scopeCoordinatedTaskFindingFailed tests
    C1significantyesnoyesyesdata retrievalscope exceededS6, S7
    C2significantyesnoyesyesunclearscope exceededS4, S7
    C3significantyesnoyesnounclearscope exceededS4
    C4significantyesnoyesyesdata retrievalscope exceededS4, S7
    C5significantyesnoyesnoaccount setupscope exceededS1, S4, S5
    C6suggestiveyesnonoyesdata retrievalin scope–
    C7suggestiveyesnonoyesdata retrievalin scope–
    C8suggestiveyesnonoyesdata retrievalin scope–
    C9suggestiveyesnonoyesdata retrievalin scope–
    C10suggestiveyesnoyesnodata retrievalscope exceededS2

    S1 off-task target S2 getting past a block S3 sensitive paths S4 unsanctioned probing S5 identities and credentials S6 data sent out S7 coordination that widens any of them

  6. Step 7

    Attribute

    Who is behind cluster C1 is answered in four layers: the developer or operator, the hosting network, the harness, the model family. Each claim carries a label (Confirmed, Suspected, Possible) that follows its evidence. A network names a host, not a developer; a model's name inside a request names no one. A developer is named only at the naming gate.

    SC-FM FM-7.1 · FM-7.7 · FM-7.8

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Synthetic example: what the records support at each attribution layerDeveloper and operatorno candidate in these recordsHosting and runtimeAS64496 · suspectedHarness and frameworkbrowser automation (Mozilla-compatible user age… · possibleModel familyno candidate in these records
    The networks here are documentation ASNs (RFC 5398): no real company is named.
    View as table
    LayerParty or candidateLabelEvidenceTag
    Hosting and runtimeAS64496suspectedhosting_asnobserved
    Hosting and runtimeAS64497suspectedhosting_asnobserved
    Harness and frameworkbrowser automation (Mozilla-compatible user agent)possibleself_idinference
    Harness and frameworkpython-httpxpossibleself_idinference
  7. Step 8

    Report, then publish

    The tools draft; a person sends, and a second person reviews every notice before it is published. Reports go to the AI provider responsible and to the affected operators first. An indicator notice follows on a short fixed clock that nothing a recipient says extends: it describes the activity and names no affected party. Operators are named in a later update, 3 working days after their report (10 if compromised), or earlier with their consent. A notice informs without enabling: it withholds working payloads, inbox and tag values, and anything that would help repeat the attack. The example indicator notice below is drafted from these synthetic records.

    SC-FM FM-10.2 · FM-11.4

    Show the figure

    Scroll the figure sideways, or open View as table below it.

    Who hears first, and when the notice may followReportsprovider and operatorsSecond reviewof the exact draftIndicator notice0 h; 24 h if compromisedNaming update3 or 10 working days
    The two clocks of the publication policy, each counted from a party's latest report; an operator whose systems were compromised waits 10 working days to be named. Working days are Monday to Friday, UTC. Nothing a recipient says moves the indicator clock; only consent names an operator sooner.
    View as table
    StageWhen
    Reportsprovider and operators
    Second reviewof the exact draft
    Indicator notice0 h; 24 h if compromised
    Naming update3 or 10 working days

Ground rules: collection is passive (no URL an agent submitted is ever opened), model names in requests are weak evidence, and a developer is named only when the evidence reaches the naming gate. Details: methodology, policies, the Field Manual.

Latest notices

No notices yet. A notice is published only after a lead has been reviewed, linked into a case and reported to the AI provider and the affected operators. Unreviewed leads never appear here. Subscribe to the Atom feed to hear about the first one.

Example notice, synthetic. Drafted by the engine from the showcase records above, never sent and never published. Real notices appear here once a reviewed incident has been reported.

What an indicator notice looks like

The first stage: what the activity was and how to recognise it. Affected organisations appear by class only; their names follow in a naming update.

Public notice: suspected AI agent activity

  • Prepared: 2026-09-16
  • Window: 2026-09-14 09:30:00 UTC → 2026-09-14 09:35:00 UTC
  • Records: 6 linked public records in 1 cluster(s) (of 48 records reviewed, 48 flagged)
  • Evidence tier: significant
  • Method: swarmchasing 0.1.0, rules version 2026-10-14.5
The rest of the example notice

Summary

Public scan and archive records show automated activity consistent with AI agents operating with little or no human oversight, aimed at a transit authority (6 records). We have not confirmed whether any request succeeded.

Indicators

CategoryRuleRecords
Relay / fetch-through servicesrelay.jina3
Agent tags and markersmarker.uq_tags6
Cache-busting parameterscache.buster3
Callback / exfiltration channelsexfil.webhook_site6
Header fingerprintsheader.headless_ua3
Header fingerprintsheader.scripted_ua3

Attribution

Each claim gives its layer, label (Confirmed, Suspected, Possible, Unattributed), tag (Observed, Documented, Inference, Conclusion) and the strongest evidence it rests on. A developer is named only on evidence at least as strong as: identifiers shared with a confirmed incident. Harness and model-family candidates are never named in public.

  • AS64496 (hosting network). 3 record(s) sent from AS64496. Label: Suspected; tag: Observed. A host is not necessarily the developer.
  • AS64497 (hosting network). 3 record(s) sent from AS64497. Label: Suspected; tag: Observed. A host is not necessarily the developer.

Endpoints

Every flagged request to each host, including requests outside the linked clusters. "Ongoing" means hit within 7 days of the newest record reviewed.

TargetHitsFirst seenLast seenStatusAttack payloads
a transit authority (6 hosts)62026-09-14 09:30:00 UTC2026-09-14 09:35:00 UTCongoingnone seen

Timeline

  • C1 (significant): 6 records, 1 run(s), 2026-09-14 09:30:00 UTC → 2026-09-14 09:35:00 UTC, median gap 60s
    • linked by: exfil.webhook_site:[withheld], param:uqtag=ag1x, param:uqtag=ag2y

Representative records

URLs are defanged. Records are listed by evidence strength.

Method and limitations

  • Collected passively from public records (scan services, web archives, certificate logs). We did not open the submitted URLs, interact with the targets, or read or post to any callback channels.
  • Records were linked by shared unique identifiers (inbox IDs, tags), by timing against the same target, and by probe chains (variants of one request to the same host and path, minutes apart). Linking is probabilistic.
  • Model names inside requests are not reliable attribution: agents misreport who built them.
  • Network attribution (ASN) identifies the hosting provider, not necessarily the developer of the agent.
  • Public records cover a fraction of activity. Private or account-linked scans are invisible to us.

Requested action

  • If you operate a listed host, check your access logs for the window above and the indicators listed, and contact us for the full report.
  • If you run an agent platform, check whether these patterns match your users' agents.
  • If anything here is wrong, tell us: corrections are published on this page with their date.