Non-LLM operations in PAP: the glue agent primitives PAP ships eight glue agents that perform deterministic structural operations without any LLM inference call, as detailed in the company's documentation. These agents, including the Type Router and Trip Assembler, implement a two-piece interface with AgentMeta and AgentExecutor::execute, and they cover four patterns—Transform, Route, Merge, and Validate—each mapped to a schema.org action type. The design ensures that agents declaring requires_disclosure: &[] and network_required: false operate with no data leakage and no outbound connections, making them first-class primitives in PAP's agent registry. PAP ships eight agents that will never make an inference call. Not because they're simple — the Trip Assembler merges flight, hotel, and activity reservations into a single typed itinerary, and the Type Router dispatches to downstream agents by inspecting a schema.org @type field. They skip the model because they don't need one. The work is structural: typed input goes in, a different typed shape comes out, deterministically, every time. These are glue agents. They're the operations that live between the reasoning steps in an agent pipeline, and they're a first-class primitive in PAP's agent registry. What a glue agent looks like Every agent in PAP, whether it calls an LLM, hits an HTTP endpoint, or runs a pure function, implements the same two-piece interface: AgentMeta declares what the agent is, and AgentExecutor::execute is what it does. For a glue agent, AgentMeta tells the whole story: AgentMeta { name: "Type Router", version: "0.1.0", provider: "PAP", action: "schema:ChooseAction", object types: & "schema:Thing" , requires disclosure: & , returns: & "schema:ChooseAction" , configurable properties: vec , network required: false, } Two fields stand out. requires disclosure: & means this agent requests no principal data. It will never see a credential, a calendar entry, or a location, because it never asked for one. network required: false means no outbound connection is made. These aren't flags you set to be polite; they're the fields the orchestrator reads when it builds the mandate. An agent that declares requires disclosure: & gets a mandate with an empty disclosure scope by construction. There's nothing to leak because there's nothing granted. The execution side is equally plain. Here's the complete implementation of TypeRouterExecutor : php fn execute &self, query: &str - Result