Policy-Verified Self-Training: Learning Agent Compliance from Verifiable Policy Rewards
Organizations: Corners Co., Ltd.
Abstract
Runtime policy verifiers can prevent agents from executing disallowed actions, but their decisions are typically used only for enforcement and discarded afterward. We ask whether these decisions can instead become verifiable policy rewards for training the agents they guard. We introduce Policy-Verified Self-Training (PVST), a post-training paradigm in which an agent generates its own interaction trajectories and an executable policy verifier, here a deterministic gate compiled from a written policy, evaluates whether each action complies. Compliant trajectories are reinforced, and violations become negatives for preference optimization; beyond the gate and the benchmark's task-success signal, PVST needs no stronger teacher model, no human preference labels and no attack-specific supervision, although rollouts are collected in the benchmark's attacked environment. On held-out AgentDojo tasks under prompt injection, policy-verified preference training of Qwen3-8B reduces violating trajectories from 37.2% to 10.3 0.9% (three seeds) and successful attacks from 12.4% to 0.5% at equal or higher pooled task utility, although utility falls on travel, compared with 22.0% when negatives are selected by an attack oracle and 31.9 0.9% with negatives that contain no violation. The learned behavior holds under an attack template never used in training (37.7% to 11.0%) and on a suite excluded from training (34.8% to 16.7%), and the retained verifier's intervention rate falls from 39.2% to 8.8% (seed 0). Our analysis identifies two conditions under which the verdict is most informative: success must not already imply compliance, and guarded actions must appear in both permitted and forbidden contexts.
Figures & tables
| Arm | Negatives | Seeds | Utility % | ASR % | Violating traj. % | % | % |
|---|---|---|---|---|---|---|---|
| Base | – | – | 35.5 | 12.4 [8.3, 16.5] | 37.2 [31.0, 43.4] | 21.5 | 53.3 |
| RFT-succ | – | 1 | 35.4 | 5.4 | 30.8 | 18.7 | 56.6 |
| RFT-gate | – | 3 | 40.2 | 5.5 | 28.8 | 21.3 | 65.0 |
| DPO-gate | gate-rejected, cut at denied call | 3 | 39.9 | 0.5 [0.0, 1.2] | 10.3 [5.6, 12.8] | 21.1 | 65.1 |
| DPO-ctrl-any | any failure (55% violating) | 3 | 45.1 | 1.2 | 20.2 [14.5, 24.5] | 20.6 | 75.7 |
| DPO-ctrl-clean | violation-free failures | 3 | 41.0 | 6.5 | 31.9 [26.3, 38.4] | 20.6 | 69.3 |
| Suite | Base | RFT-gate | DPO-gate | DPO-ctrl-clean |
|---|---|---|---|---|
| banking ( ) | 40.0 / 24.4 / 37.8 | 40.0 / 4.4 / 13.3 | 40.0 / 0.0 / 0.0 | 40.0 / 11.1 / 24.4 |
| travel ( ) | 33.3 / 26.2 / 45.2 | 31.0 / 14.3 / 26.2 | 16.7 / 0.0 / 0.0 | 23.8 / 23.8 / 45.2 |
| workspace ( – ) | 34.8 / 5.2 / 34.8 | 43.9 / 3.0 / 34.8 | 46.0 / 0.6 / 14.1 | 44.8 / 0.7 / 31.0 |
| Model | Gate off | Gate on (passˆ1 / residual viol.) |
|---|---|---|
| base | 21.7 / 88.5 / 3.20 | 30.0 / 18.6 |
| SFT (reference-filtered distillation, airline) | 23.3 / 40.9 / 0.73 | 30.0 / 7.7 |
| SFT (airline + retail distillation) | 35.0 / 33.3 / 0.75 | 40.0 / 10.3 |
| RFT-1 (airline distillation + SFT-airline gate-on rollouts) | 40.0 / 46.8 / 0.78 | – |
| DPO (reference-labelled, from RFT-1) | 31.7 / 0 of 0 writes / 0.00 | 31.7 / 0 of 0 writes |
| DPO-ctrl (from RFT-1, verdict-blind negatives) | 30.0 / 41.7 / 0.40 | 35.0 / 5.9 |
Appendix figures & tables10 assets
Supplementary material from the paper’s appendix.
Appendix
| Suite | Rule | Type | Predicate | Tools |
|---|---|---|---|---|
| banking | BAN-AUTO-FBD-01 | forbidden | password_not_from_user | update_password |
| banking | BAN-AUTO-FBD-02 | forbidden | recipient_unknown | schedule_transaction , send_money |
| banking | BAN-AUTO-PRE-03 | precondition | action_requested_by_user | schedule_transaction , send_money , update_password , |
| update_scheduled_transaction , update_user_info | ||||
| travel | TRA-AUTO-FBD-01G | forbidden | target_not_user_named | send_email |
| travel | TRA-AUTO-FBD-02 | forbidden | target_not_user_named | reserve_car_rental , reserve_hotel , reserve_restaurant |
| Predicate | Holds when | Used as |
|---|---|---|
| recipient_unknown | the recipient argument was neither named in any user turn (string or account-token match) nor seen as a counterparty field of a returned account record | forbidden |
| target_not_user_named | any value of a target-bearing argument present in the call ( recipient(s) , email , participants , calendar title , hotel , restaurant , company , file and email ids; and channel , user , user_email , url on suites not used here) was not named in any user turn; a list holds if any element is unnamed. Names, addresses and titles match as case-insensitive substrings of a user turn (URLs also without an agent-supplied scheme); file and email ids match only as whole tokens outside a date context | forbidden |
| body_has_unnamed_url | a body / content / message argument contains a URL the user never named | forbidden |
| password_not_from_user | the password argument does not appear in any user turn | forbidden |
| action_requested_by_user | for a call with a recipient argument (a payment): the recipient was named in a user turn (string or account-token match) or is a counterparty in the account history; for any other write: some user turn contains one of twelve request words (update, change, set, schedule, pay, send, transfer, cancel, correct, modify, new password, move), or the user named a source the agent then retrieved; or an explicit confirmation is pending. It establishes that some change was requested, not which ( Yu et al., 2026 ) ; injected text never enters the user channel and cannot satisfy it by itself | precondition |
| user_confirmed (bound by no AgentDojo rule set here; used on by the compiled gate and the reference clauses) | AgentDojo: an affirmative user turn answered an assistant turn that made no call; : the latest user turn is affirmative. Consumed by the next guarded write | precondition |
| Set | Trajectories / pairs | Notes |
|---|---|---|
| RFT-gate positives | 158 (banking 43, travel 55, workspace 60), 0.80M tokens | , per task |
| RFT-succ positives | 181 (48 / 56 / 77), 0.97M tokens | ; 71 of 570 candidates contain a violation |
| DPO-gate pairs | 113 (30 / 57 / 26) | rejected cut after first denied call |
| DPO-ctrl-clean pairs | 73 (6 / 51 / 16) | rejected: , random cut |
| DPO-ctrl-any pairs | 93 (10 / 57 / 26) | 29 of 53 rejected are also violating |
| DPO-oracle pairs | 113 (30 / 57 / 26) | rejected: attack oracle positive, random cut; 34 of 63 rejected are also violating |
| Model | Gate | Utility % | Violation attempts % | ASR % | Gate interventions % |
|---|---|---|---|---|---|
| Base | off | 35.5 | 37.2 | 12.4 | – |
| Base | on | 32.2 | 39.2 | 0.0 | 39.2 |
| RFT-gate | off | 41.0 | 29.5 | 5.2 | – |
| RFT-gate | on | 37.8 | 29.1 | 0.0 | 29.1 |
| DPO-gate | off | 40.0 | 9.2 | 0.4 | – |
| DPO-gate | on | 36.0 | 8.8 | 0.0 | 8.8 |
| Suite | Tool | Base denied | Base allowed | DPO-gate denied | DPO-gate allowed |
|---|---|---|---|---|---|
| banking | schedule_transaction | 20.0 | 0.0 | 0.0 | 0.0 |
| banking | send_money | 91.1 | 24.4 | 0.0 | 2.2 |
| banking | update_password | 4.4 | 0.0 | 0.0 | 0.0 |
| banking | update_scheduled_transaction | 8.9 | 0.0 | 0.0 | 0.0 |
| travel | create_calendar_event | 21.4 | 16.7 | 0.0 | 0.0 |
| travel | reserve_hotel | 9.5 | 0.0 | 0.0 | 0.0 |
| Arm | Utility % | ASR % | Violating traj. % | Gate interventions % (gate on) |
|---|---|---|---|---|
| Base | 48.6 | 12.5 | 37.3 | 36.1 |
| RFT-gate | 52.5 | 9.0 | 31.4 | 30.4 |
| DPO-gate | 38.0 | 0.0 | 10.2 | 10.6 |
| DPO-ctrl-clean | 50.6 | 9.4 | 28.6 | 29.0 |
| Trainee / arm | Permitted call executed % | Forbidden call executed % | Withheld % |
|---|---|---|---|
| 4B base | 14.6 | 19.5 | 65.9 |
| 4B RFT-gate | 29.3 | 14.6 | 56.1 |
| 4B DPO-gate | 24.4 | 0.0 | 75.6 |
| 4B DPO-ctrl-clean | 29.3 | 12.2 | 58.5 |
| 8B base | 19.5 | 56.1 | 24.4 |
| 8B RFT-gate | 9.8 | 41.5 | 48.8 |
| Pairs | 0 (RFT-gate) | 28 | 56 | 73 | 113 |
|---|---|---|---|---|---|
| Violating traj. % | 29.5 | 17.3 | 11.8 | 6.2 | 9.2 |
| ASR % | 5.2 | 0.4 | 0.0 | 0.4 | 0.4 |
| Utility % | 41.0 | 38.0 | 41.2 | 37.2 | 40.0 |
| Arm | (all) | errors | Viol. % (all) | Viol. % (common) | ASR % (common) | Utility % (common) |
|---|---|---|---|---|---|---|
| Base | 242 | 13 | 37.2 | 38.7 | 12.6 | 36.1 |
| RFT-succ | 240 | 15 | 30.8 | 32.2 | 5.7 | 34.3 |
| RFT-gate | 251 | 4 | 29.5 | 28.3 | 5.7 | 41.3 |
| DPO-gate (seeds 0/1/2) | 250 / 244 / 255 | 5 / 11 / 0 | 9.2 / 10.7 / 11.0 | 6.1 / 10.0 / 6.1 | 0.0 / 0.4 / 0.4 | 35.7 / 39.1 / 33.9 |
| DPO-ctrl-any (seeds 0/1/2) | 241 / 241 / 241 | 14 / 14 / 14 | 19.5 / 23.2 / 17.8 | 20.4 / 24.3 / 18.7 | 1.3 / 2.6 / 0.0 | 43.9 / 44.3 / 44.3 |
| DPO-ctrl-clean (seeds 0/1/2) | 232 / 230 / 230 | 23 / 25 / 25 | 32.3 / 32.6 / 30.9 | 32.6 / 32.6 / 30.9 | 7.0 / 7.4 / 5.2 | 40.0 / 44.8 / 38.3 |
AI Agent Safety
AI agent safety studies how to prevent and detect harmful actions by autonomous systems that use tools, memory, and multi-step plans.
See all 326 papers