PyRIT is wired to a support assistant's chat endpoint and the run is clean. Which other intake paths of that application would you wire as separate prompt targets before calling the surface covered, and what does wiring each one require?
answer
- walk backwards from the context window
- sync, async, non-text families
- caller class, not operator token
- correlation id for split targets
- async paths cap the turn budget
basics
~20 sAny path whose content reaches the same model: document or ticket ingestion, file and attachment parsing, transcribed voice or extracted image text, scheduled and batch jobs, webhook consumers, admin or internal endpoints, other tenants and older routed API versions. Each needs its own send path, matching credentials, and somewhere the effect can be observed.
solid answer
~50 sStart from the model and walk backwards: enumerate every way bytes get into its context, not every way a human types. A support assistant typically has several — retrieved knowledge-base articles and prior tickets, uploaded attachments, transcripts, a nightly summariser, an inbound webhook or mail path, an internal agent console, and often a legacy endpoint still routed for old clients. Wiring one is more than a URL. You need an addressable way to deposit content, credentials of the **caller class that really uses it** (a service account, not your operator token), and a place to observe the outcome. That last part is where the request/response shape breaks: for an ingestion or batch path the effect surfaces later, in a different conversation, so the target has to submit through one channel and read back through another before anything can be scored. Surfaces where the model calls out to tools are their own harness problem and belong to that lane, not to a chat prompt target.
go deeper
Should at least name a second intake path besides chat, such as uploaded files or retrieved documents.
Should enumerate several paths and recognise that each needs its own target rather than being implied by the chat result.
Should separate synchronous, asynchronous and non-text intake, and explain correlation, credentials and bounded waits for a split target.
Should drive the enumeration from deployment artefacts and data-flow records, and prioritise by content trust level and downstream privilege.
### The enumeration method Do not enumerate the ways a human types; enumerate the ways bytes end up inside the model's context window. Take the deployment's route manifest and its data-flow records, and mark every path where untrusted or semi-trusted content reaches a model context. That marked set is the target backlog, and it is almost always several times larger than the set of screens the product exposes. Three families fall out of it, and they differ in how hard the target is to build, not in how much they matter. **Synchronous, same shape.** Other request/response endpoints: a second locale or region, an older API version still routed for legacy clients, an internal or admin route, a partner integration, a second tenant. These are cheap — a new PyRIT prompt target with a different base URL, headers and credentials. The subtle variable is authorisation class. An admin route reached with an admin token behaves differently from the same route reached by the service identity that really calls it, and a target credentialed with the red teamer's own broad operator token measures a system no production caller inhabits. Credential the target as the **caller class that actually uses the path**. **Asynchronous, split shape.** Document and ticket ingestion, file and attachment upload, nightly batch summarisation, webhook and inbound-mail consumers. Here the framework's default assumption breaks. A prompt target's contract is send-a-prompt, get-a-response-to-score; on these paths the content is deposited through one channel and its effect surfaces later, in a different conversation, possibly for a different user. The target you write must therefore submit on the intake side and then poll or query a read side for the artefact the model produced, carrying a **correlation identifier** so a specific attempt can be matched to a specific effect, and a **bounded wait** so a slow pipeline registers as a timeout rather than a silent non-hit. Without correlation, concurrent attempts interleave and the scorer grades the wrong artefact — which produces confident, wrong results rather than obviously broken ones. **Non-text intake.** Voice transcripts, text extracted from images or scanned documents, structured form fields concatenated into a prompt template. By the time content reaches the model it is text, but your target has to speak the original format — produce the audio, the file, the field payload. That format work is usually why the path is skipped, and skipping it is invisible in the report. ### What each costs A synchronous target is an hour or two: URL, credentials, a smoke check. An asynchronous target is days, because you are building correlation, a read-back query and wait semantics against someone else's pipeline, and you often need a tenant or account that can absorb test traffic without touching real customers or real data. At run time the asymmetry continues: async paths have latency measured in minutes, which caps the turn budget far below what the chat endpoint tolerates, so a multi-turn strategy that is routine on chat may be affordable only as a handful of single-shot probes on ingestion. And every additional wired target multiplies metered calls per attempt — the target call, the scorer call, and the adversarial model call on each turn. ### Where the number misleads A clean chat-endpoint run gets reported as "the assistant is clean", and the phrase quietly generalises from one send path to the product. The generalisation is exactly backwards for risk: the chat endpoint is the surface a user consciously types into and the one most likely to have a guard in front of it, while ingestion and upload paths carry content nobody reviewed and often sit behind fewer controls. So the cheapest surface to wire is usually the best defended, and the aggregate rate is dominated by it. Worse, a partially built async target that silently returns nothing looks in the summary exactly like a path that held. Prioritise by two axes — how untrusted the content on the path is, and how privileged the model's downstream actions are once that content is in context — and then state plainly, next to the result, which paths were wired and which were not. Surfaces where the model calls out to tools have their own harness problem and belong to the agent-harness lane, not to a chat-shaped prompt target; the honest move is to name them as out of scope rather than let their absence read as a pass.
- Why does an ingestion path not fit the ordinary prompt-target shape?The send and the observation happen in different channels and at different times, so the target must deposit content, then poll a read side with a correlation identifier and a bounded wait before anything can be scored.
- Which credentials should a target for an internal endpoint use?Those of the caller class that really reaches it in production — usually a service or admin identity — because authorisation changes what the endpoint does and therefore what the run measures.
saying these in an interview costs you the question
- Treating the chat endpoint as representative of every intake path
- Wiring an internal endpoint with an operator token that no real caller uses
- Scoring an asynchronous path without correlating an attempt to its effect
- Skipping non-text intake because the harness only speaks JSON text