01 / The taskAn ordinary question, an unusual route
Someone wanted Thai drug-enforcement statistics for a particular year. On March 6, 2026, a series of requests kept returning to the same government data endpoint. Eventually, the web addresses themselves carried small programs asking a remote browser to retrieve the answer.
The sequence survives in URLQuery, a service that opens suspicious addresses and records what happens. Researchers at Transluce identified this activity in their September 23 investigation. They explained how a program could fetch statistics, then place part of the answer inside another web address.
Fide returned to that known sequence to compare the instructions with the recorded responses and subsequent requests. One result captures why those checks matter: the final report listed zero bytes for its page representation, while its network history recorded an outgoing request carrying statistics fields.
The page-size field could not tell us what the browser had done. The requests told us more.
One address, several possible actions
- 01Open the carrier page
- 02Receive a program
- 03Request the statistics
- 04Send output in another URL
This is a problem an investigator has to solve before a defender can act. Opening one address may cause a remote browser to fetch from another service and send output to a third destination. Each step raises a different question: was it requested, did it happen, did the result arrive, and was it authorized?
Our reconstruction follows those questions through four attempts. In some, the recorded evidence stops before the program’s delivery can be confirmed. In the final one, activity continues beyond what the empty page metadata might suggest.
02 / The instructionsA web address with work to do
An ordinary address tells a browser where to go. These addresses also contained instructions for what to do there.
They pointed to httpbin, a service whose Base64 endpoint can return text packed inside a URL. Base64 is a way to encode text for transport. Here, the text was HTML and JavaScript: a page containing a program the browser could run.
The first two programs asked the browser to fetch statistics and display the response. The later two asked it to place the beginning of that response inside another request to httpbin. That would leave some of the answer in the network history even if it never appeared as readable page content.
Reading these instructions establishes the proposed route. To find out how far an attempt got, we have to compare them with the record of what followed.
Four programs. Different recorded effects.
Report 19:52:27 UTC
A program in the address
The text asks for the statistics. The retained requests reach only the carrier and favicon.
Report 19:57:22 UTC
A request reaches the source
The revised program is followed by a statistics request and a 200 response. The response body is absent from the acquired JSON.
Report 20:03:47 UTC
A relay planned, then a 404
The program now asks to send output. The carrier returns 404; no source or output request appears in the retained entries.
Report 20:07:41 UTC
The output enters the network record
The archive records a statistics request and a later request carrying statistics fields. The final DOM size is zero.
All four source records are shown when scripting is disabled.
At 19:52, the address contains a 212-byte program. The server reports HTTP status 200, the familiar success response. But the archive describes only 51 bytes with a different content fingerprint. It records no script and no request to the statistics endpoint, only the carrier page and its favicon. The status says the request received a successful response; it does not establish that the proposed program arrived.
The 19:57 report offers a stronger chain. The decoded 207-byte program matches the recorded response’s SHA-256 fingerprint, a value calculated from bytes to check content identity. Its script also matches a recorded script fingerprint. A request to the statistics endpoint follows and receives a 200 response.
Now we have corroboration for delivery and a subsequent action. We still cannot inspect the statistics returned: the acquired JSON lacks the source response body. Matching fingerprints help identify content the archive observed; they do not show that every instruction completed.
At 20:03, the next program asks to relay the answer. Its carrier returns 404 with a different fingerprint. The retained entries show neither a statistics request nor an output request.
Four programs built around the same task do not amount to four confirmed successes. The final attempt adds evidence the earlier attempts lack.
03 / The outputZero bytes, with more happening elsewhere
In the report generated at 20:07, both the decoded program and its script match the archive’s corresponding fingerprints. The network entries record the carrier page, a request to the statistics endpoint and then a request back to httpbin.
At 20:07:21.788 UTC, that outgoing request carries province and arrest-statistics fields in its address. A 200 response follows. The submitted program specifies sending the beginning of the retrieved text.
The page field was empty. The network history was not.
Recorded DOM size
Statistics in the address
- Recipient
- httpbin.org
- Request field
- Query parameter
d - Content markers
PROV_NAMEarrestAll_case- Response
- 200
Receipt is supported by the request/response entry. Exact source-to-output byte equality remains unverified.
final.dom.size and http[0].The same report lists its final DOM, the recorded representation of the page, as zero bytes. That is a fact about one field. The outgoing request is a fact about an action. An account that stops at the field misses evidence present elsewhere in the same report.
How much does the outgoing request establish? It records statistics fields sent onward and a response. It does not show whether the original AI agent received or used an answer. Without the source response body, we also cannot independently establish exact equality between the retrieved text and the fields sent onward.
Permission is a separate question again. The statistics were public, and the archive does not tell us the operator’s policy. We can describe the action; we cannot classify it as unauthorized disclosure from these records.
These distinctions preserve the finding. An uncertain answer to “was it allowed?” does not erase an observed request. An observed request does not answer “did the original agent get the result?”
04 / The auditOne technique carried several kinds of content
We extended the check across 187 selected reports: the 29-record March 6 sequence and 158 comparison records. Seven submitted addresses contain decodable httpbin payloads. We checked all seven: the four programs above, two later March answer tables and a September diagnostic page drawn from Transluce’s background examples.
Five matched their recorded response fingerprints. Those were the two March 6 programs with recorded statistics requests, both answer tables and the diagnostic page. The two mismatches were the 19:52 and 20:03 attempts.
Seven payloads. Five matching response fingerprints.
The two mismatches occur in the March 6 sequence. Neither retained record shows the planned statistics request.
| Submitted content | Response fingerprint | Script fingerprint |
|---|---|---|
| Fetch and display03-06 · 19:52 UTC | Differs212 bytes submitted · 51 reported | No entry recorded |
| Fetch and display03-06 · 19:57 UTC | Matches207 bytes submitted · 207 reported | Matching entry |
| Fetch and relay03-06 · 20:03 UTC | Differs211 bytes submitted · 233 reported | No entry recorded |
| Fetch and relay03-06 · 20:07 UTC | Matches183 bytes submitted · 183 reported | Matching entry |
| Labor statistics table03-11 · 12:05 UTC | Matches221 bytes submitted · 221 reported | No submitted script |
| Metals prices table03-15 · 13:53 UTC | Matches333 bytes submitted · 333 reported | No submitted script |
| Page diagnostic09-20 · 00:04 UTC | Matches173 bytes submitted · 173 reported | Matching entry |
Read “no entry recorded” as a limit of this acquired record. It is not proof that nothing happened elsewhere.
Five of the submitted payloads contain scripts. Three have matching script fingerprints in the archive: the two March 6 programs just noted and the diagnostic page. The other two have no recorded script entry. The plain answer tables contain no script to compare.
This is why a recognizable technique is a starting point for inquiry. The same kind of address carried instructions, answers and a browser test. Its presence alone cannot identify an actor. Transluce had already described the March tables and used multiple signals for attribution; our contribution is to check the content supported by each acquired record.
Nor is five out of seven a success rate for AI agents. These are selected records, and the matches concern content fingerprints. They do not recover missing response bodies, authenticate who submitted a request or explain why a mismatch occurred.
At 19:52, that boundary affects how we read the original investigation. Transluce’s timeline describes the attempt as fetching data. Our acquired JSON lacks the target request. We therefore cannot corroborate that part of the account from this source. Another retained view might support it; absence from our record is not proof that fetching never happened.
05 / The judgmentWhat should the defender check next?
Imagine a defender deciding whether to allow the initial request. It sees httpbin as the destination. The program inside the address also asks a remote browser to contact the statistics service and send output onward. A check limited to the first destination would leave those later actions unexamined.
The defender needs to know whether the applicable permission covers the sequence and which effects it can observe. We cannot reconstruct the historical permission policy from this archive. We can make the observed actions and unanswered questions explicit.
What the final March record establishes
Historical archive · March 6, 2026 · report 81699969
- Proposed actionRecorded
Fetch the Thai statistics and send the beginning of the response to httpbin.
Source: submit.url.addr, decoded as inert text- PermissionUnknown
The original operator’s permission policy is not in the acquired record.
Source: Contribution and scope- Observed requestsRecorded
Carrier, statistics endpoint, then output request, ordered by their timestamps.
Source: 81699969: http[1], http[2], http[0]- Recipient evidenceRecorded
The output URL contains statistics fields; its request has a recorded 200 response.
Source: http[0].url.addr; http[0].response.status_code- RecoveryUnknown
No recovery action is established by this acquired record. This does not establish that recovery was required.
Source: Seven-carrier audit and worked evidence records- Still unresolvedUnknown
Exact source-to-output equality and whether the original agent received or used the answer.
Source: records[3]; limits
This account separates what an investigator knows from what a defender might still need. The outgoing request is recorded. Original-agent receipt and operator authorization remain unresolved. A useful report should preserve all three facts without letting one stand in for another.
A separate local experiment shows why that distinction matters after a transfer, too. We sent a synthetic test file to an approved recipient. The recipient read all 59 intended bytes, recorded a matching content fingerprint, then deliberately closed the connection without replying. The sender reported failure.
The failure message arrived after the file did.
This is a constructed demonstration of transfer behavior, not a reproduction of the URLQuery episode or an evaluation of an AI defender. It establishes a specific point: sender failure cannot, on its own, show that receipt was prevented. The experiment design and recipient records make that check reproducible.
Now consider the next decision. Retrying could repeat a transfer that had already happened. Treating failure as prevention could close an investigation too soon. These are consequences to test, not outcomes we measured in an autonomous system.
That is the next step for Fide: test whether tracing downstream actions and checking recipient evidence improve a defender’s choices. We want to measure when it should allow, investigate, retry or begin recovery, alongside the legitimate work its interventions interrupt. More visibility is useful only if it helps make a better decision.
The statistics task gives us a concrete place to begin. Its evidence is spread across an address, a response and another request. Before a defender acts on a simple success or failure label, it needs an account of which part of that sequence the label describes.
Scope, methods and review status
We acquired 187 selected JSON reports: all 29 March 6 reports assigned to the ONCB sequence, 79 March records from three other task families and 79 upstream background examples. Automated extraction covered 2,978 HTTP entries. Close reading focused on the sequence and all seven decodable httpbin payloads. These are not 187 agents, attacks or independently confirmed incidents.
The carrier audit percent-decodes the address once, validates Base64 and compares the decoded bytes with the response fingerprint for that exact submitted address. It compares inline script fingerprints separately. The downloadable audit includes all seven records, source hashes and field locators. No embedded program was executed or target visited.
No HTTP entry included raw response-body data. In 128 entries, a positive reported body size coexists with the empty-string SHA-256 value. We do not use those fields to establish content equality. The five matching carrier fingerprints in this audit are nonempty values; they still depend on the archive's representation.
Three new archive searches returned empty service responses without a verifiable zero-results message. They established neither new activity nor its absence. Transluce retains credit for the discovery and attribution analysis. Our contribution is the reconstruction and evidence audit.
Independent human technical review remains pending. Download the methods and research package to inspect the code, results, claim register and worked evidence records. Full third-party reports remain at their source; mutable archive metadata can change on a fresh download.