PolicyGuide: From Guarding One Action to Guiding the Whole Workflow for Policy-Compliant LLM Agents
Organizations: KAIST
Abstract
Customer-service LLM agents must follow organizational policy when acting on a user's behalf. Compliance failures arise from either forbidden actions, such as granting an ineligible change, or omitted procedural requirements, such as identification or confirmation. Runtime safeguards can intervene on risky actions, but action-local checks do not guide an agent through a multi-step procedure. Workflow-following systems support prescribed process execution, but primarily target workflow completion rather than safeguarding agent behavior. PolicyGuide instead compiles each domain policy into a workflow graph and invokes a proactive verifier at user-turn boundaries. From persisted graph state, the verifier reconciles open requests and returns step-specific remediation along a policy-compliant path. Across the -bench airline, retail, and telecom domains with a GPT-5.4 agent and verifier, PolicyGuide raises mean from to , with the largest gain on telecom ( to ), the most workflow-structured domain. The same workflows transfer to Claude Sonnet 4.6 and Gemini 2.5 Pro agents. Complementary evaluations find the lowest observed attack-success rate under adversarial users and the strongest procedural compliance in an author-designed workflow-level validation.
Figures & tables
| Airline (50) | Retail (114) | Telecom (114) | |||||||||||
| System | Verifier | Overall | PV | Mut | Overall | PV | Mut | Overall | PV | Mut | |||
| ReAct | — | 0.640 | 0.865 | 0.433 | 0.800 | 0.900 | 0.791 | 0.384 | 0.721 | 0.180 | |||
| ToolGuard | static code | 0.575 | 0.969 | 0.212 | — | — | — | — | — | — | |||
| PolicyGuard | GPT 5.4 | 0.710 | 1.000 | 0.442 | 0.645 | 0.975 | 0.613 | 0.406 | 0.733 | 0.208 | |||
| PolicyGuide | GPT 5.4 | 0.775 | 0.979 | 0.587 | 0.809 | 0.975 | 0.793 | 0.866 | 0.895 | 0.849 | |||
| ReAct | — | 0.460 | 0.750 | 0.192 | 0.596 | 0.700 | 0.587 | 0.193 | 0.442 | 0.042 | |||
| Domain | Metric | ReAct | PolicyGuide Self | PolicyGuide Raw | PolicyGuide |
| Airline | Overall | 0.460 | 0.480 | 0.520 | 0.620 |
| PV | 0.750 | 0.833 | 0.875 | 0.917 | |
| Mut | 0.192 | 0.154 | 0.192 | 0.346 | |
| Retail | Overall | 0.575 | 0.350 | 0.575 | 0.725 |
| PV | 0.750 | 0.750 | 0.750 | 1.000 | |
| Mut | 0.556 | 0.306 | 0.556 | 0.694 |
| System | Runtime control | Pass 4 |
| ReAct | actor only | 0.250 |
| PolicyGuard | action-local check | 0.325 |
| FlowAgent | PDL + API control | 0.350 |
| PolicyGuide | external graph verifier | 0.675 |
| Agent | Metric | ReAct | PolicyGuard | PolicyGuide |
| GPT 5.4 | Overall | 0.460 | 0.580 | 0.620 |
| PV | 0.750 | 1.000 | 0.917 | |
| Mut | 0.192 | 0.192 | 0.346 | |
| Claude Sonnet 4.6 | Overall | 0.720 | 0.780 | 0.780 |
| PV | 0.958 | 1.000 | 1.000 | |
| Mut | 0.500 | 0.577 | 0.577 |
| System | Step-TCR | Trace-TCR | Process-valid rate |
| ReAct | 86.4 | 35.4 | 17.5 |
| PolicyGuard | 85.7 | 23.9 | 13.1 |
| PolicyGuide | 94.5 | 63.4 | 56.2 |
Appendix figures & tables21 assets
Supplementary material from the paper’s appendix.
Appendix
| Domain | A | P | W | Total | % P+W | % W |
| Airline | 14 | 27 | 2 | 43 | 67.4% | 4.7% |
| Retail | 0 | 27 | 1 | 28 | 3.6% | |
| Telecom (main) | 1 | 21 | 7 | 29 | 96.6% | 24.1% |
| Telecom (manual) | 0 | 1 | 20 | 21 | 100% | 95.2% |
| Telecom (both) | 1 | 22 | 27 | 50 | 98.0% | 54.0% |
| ID | Line | Requirement (paraphrased) | Type |
| Global rules | |||
| G1 | 10 | Authenticate identity by locating the user id via email or name+zip—even when the user already provides the id | P (D+T) |
| G2 | 14 | One user per conversation; deny any request about another user | P (D) |
| G3 | 16 | List action details + obtain explicit “yes” before any DB-updating action | P (D) |
| G4 | 18 | No fabricated information/knowledge/procedures; no subjective recommendations | P (D) |
| G5 | 20 | At most one tool call per turn (not paired with a user-facing reply) | P (D) |
| ID | Line | Requirement (paraphrased) | Type |
| Global rules | |||
| G1 | 7 | No fabricated information/knowledge/procedures; no subjective recommendations | P (D) |
| G2 | 9 | At most one tool call per turn (not paired with a user-facing reply) | P (D) |
| G3 | 11 | Deny user requests that are against the policy | P (D) |
| G4 | 13 | Transfer iff unhandleable: call transfer_to_human_agents , then the literal handoff message | W (D) |
| G5 | 15 | Try your best to resolve the issue before transferring | W (D) |
| ID | Line | Requirement (diagnose conditional fix verify) | Type |
| Cellular service (ll. 55–99) | |||
| TSS1 | 69–72 | Diagnose service via check_status_bar | P (T) |
| TSS2 | 74–78 | If Airplane Mode ON guide toggle_airplane_mode OFF | W (D+T) |
| TSS3 | 79–87 | Check SIM: Missing reseat; Locked escalate; Active ok (three-way branch) | W (D+T) |
| TSS4 | 88–92 | If APN incorrect guide reset_apn_settings , then reboot_device | W (D+T) |
| TSS5 | 93–99 | If line suspended handle per main policy, then verify service restored | W (T) |
| Domain | System | |||||
| Airline | ReAct | 0.640 | 0.530 | 0.485 | 0.460 | 0.72 |
| ToolGuard | 0.575 | 0.553 | 0.535 | 0.520 | 0.90 | |
| PolicyGuard | 0.710 | 0.630 | 0.595 | 0.580 | 0.82 | |
| PolicyGuide | 0.775 | 0.707 | 0.660 | 0.620 | 0.80 | |
| Retail | ReAct | 0.800 | 0.700 | 0.638 | 0.596 | 0.75 |
| PolicyGuard | 0.645 | 0.506 | 0.421 | 0.360 | 0.56 |
| Domain | System | T1 | T2 | T3 | T4 | pstd |
| Airline | ReAct | 0.620 | 0.620 | 0.640 | 0.680 | 0.024 |
| ToolGuard | 0.560 | 0.580 | 0.580 | 0.580 | 0.009 | |
| PolicyGuard | 0.700 | 0.740 | 0.700 | 0.700 | 0.017 | |
| PolicyGuide | 0.800 | 0.720 | 0.820 | 0.760 | 0.038 | |
| Retail | ReAct | 0.807 | 0.746 | 0.842 | 0.807 | 0.035 |
| PolicyGuard | 0.649 | 0.623 | 0.632 | 0.675 | 0.020 |
| Opponent | ||||||
| ReAct | 3 | 77 | 19 | 96 | ||
| PolicyGuard | 3 | 97 | 19 | 116 |
| Domain | Opponent | [95% CI] | |
| Airline | ReAct | 50 | [ , ] |
| ToolGuard | 50 | [ , ] | |
| PolicyGuard | 50 | [ , ] | |
| Retail | ReAct | 114 | [ , ] |
| PolicyGuard | 114 | [ , ] | |
| Telecom | ReAct | 114 | [ , ] |
| Domain | Calls/ task | Prompt tok./call | Cached input | Output tok./call | Guide total $ | Guide $/task |
| Airline | 7.56 | 32,360 | 88.1% | 2,478 | 20.10 | 0.40 |
| Retail | 7.42 | 22,803 | 85.8% | 2,179 | 13.67 | 0.34 |
| Telecom | 11.47 | 28,518 | 86.5% | 2,186 | 22.29 | 0.56 |
| Domain | ReAct (s/task) | PolicyGuide (s/task) | Ratio |
| Airline | 36.4 | 210.1 | |
| Retail | 34.6 | 193.6 | |
| Telecom | 45.5 | 247.6 |
| Domain | Nodes | Auth. nodes | Validator flags |
| Airline | 158 | 11 | 0 |
| Retail | 104 | 7 | 0 |
| Telecom | 127 | 5 | 1 |
| Call-NMR (%; ) | Airline | Retail | Telecom † |
| ReAct | 25.4 | 47.6 | 0.0 |
| PolicyGuard | 32.5 | 34.8 | 0.0 |
| PolicyGuide | 15.6 | 34.7 | 0.0 |