Skip to content

Commit 18a6288

Browse files
committed
Update trust_cascading policy
1 parent f078693 commit 18a6288

5 files changed

Lines changed: 71 additions & 86 deletions

File tree

tools/src/test/java/dev/cel/tools/ai/AgenticPolicyCompilerTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
import dev.cel.common.types.SimpleType;
2222
import dev.cel.common.types.StructTypeReference;
2323
import dev.cel.expr.ai.Agent;
24+
import dev.cel.expr.ai.AgentContext; // New Import
2425
import dev.cel.expr.ai.AgentMessage;
2526
import dev.cel.expr.ai.Finding;
2627
import dev.cel.expr.ai.Tool;
2728
import dev.cel.expr.ai.ToolAnnotations;
2829
import dev.cel.expr.ai.ToolCall;
30+
import dev.cel.expr.ai.TrustLevel; // New Import
2931
import dev.cel.parser.CelStandardMacro;
3032
import dev.cel.policy.testing.PolicyTestSuiteHelper;
3133
import dev.cel.policy.testing.PolicyTestSuiteHelper.PolicyTestSuite;
@@ -49,15 +51,20 @@ public class AgenticPolicyCompilerTest {
4951
.setContainer(CelContainer.ofName("cel.expr.ai"))
5052
.setStandardMacros(CelStandardMacro.STANDARD_MACROS)
5153
.addMessageTypes(Agent.getDescriptor())
54+
.addMessageTypes(AgentContext.getDescriptor())
55+
.addMessageTypes(TrustLevel.getDescriptor())
5256
.addMessageTypes(ToolCall.getDescriptor())
5357
.addMessageTypes(Tool.getDescriptor())
5458
.addMessageTypes(ToolAnnotations.getDescriptor())
5559
.addMessageTypes(AgentMessage.getDescriptor())
5660
.addMessageTypes(Finding.getDescriptor())
61+
5762
.addVar("agent.input", StructTypeReference.create("cel.expr.ai.AgentMessage"))
63+
.addVar("agent.context", StructTypeReference.create("cel.expr.ai.AgentContext"))
5864
.addVar("tool.name", SimpleType.STRING)
5965
.addVar("tool.annotations", StructTypeReference.create("cel.expr.ai.ToolAnnotations"))
6066
.addVar("tool.call", StructTypeReference.create("cel.expr.ai.ToolCall"))
67+
6168
.addFunctionDeclarations(
6269
newFunctionDeclaration(
6370
"ai.finding",
@@ -177,6 +184,10 @@ private enum AgenticPolicyTestCase {
177184
OPEN_WORLD_TOOL_REPLAY(
178185
"open_world_tool_replay.celpolicy",
179186
"open_world_tool_replay_tests.yaml"
187+
),
188+
TRUST_CASCADING(
189+
"trust_cascading.celpolicy",
190+
"trust_cascading_tests.yaml"
180191
);
181192

182193
private final String policyFilePath;
@@ -217,4 +228,4 @@ private void runTests(Cel cel, CelAbstractSyntaxTree ast, PolicyTestSuite testSu
217228
}
218229
}
219230
}
220-
}
231+
}

tools/src/test/resources/trust_cascading.celpolicy

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,34 @@ name: "policy.trust.cascading"
22
default: allow
33

44
variables:
5-
- trust_decision: >
6-
security.cascade_trust(agent.history())
5+
# Critical security threats
6+
- is_compromised: >
7+
agent.context.trust.findings.contains([ai.finding("compromised_session", 0.9)])
8+
9+
# Compliance and/or hygiene issues with the source
10+
- is_unverified: >
11+
agent.context.trust.findings.contains([ai.finding("unverified_source", 0.8)])
712

813
rules:
9-
- description: "Elevate trust and replay model call if required"
10-
condition: variables.trust_decision.action == 'REPLAY'
14+
- description: "Block sessions with high-confidence compromise indicators"
15+
condition: variables.is_compromised
16+
effect: deny
17+
message: "Critical Trust Failure: Session is potentially compromised."
18+
19+
- description: "Replay to request source verification"
20+
condition: variables.is_unverified
1121
effect: replay
1222
output_expr: |
1323
{
14-
'append_attributes': variables.trust_decision.new_attributes,
15-
'reason': 'Trust elevation required for proper answer.'
24+
'reason': 'Data source is unverified.',
25+
'action': 'verify_provenance'
1626
}
1727

18-
- description: "Trust sufficient, allow execution"
19-
condition: variables.trust_decision.action == 'ALLOW'
20-
effect: allow
21-
message: "Trust level sufficient."
28+
- description: "Replay generic untrusted contexts"
29+
condition: agent.context.trust.level == 'untrusted'
30+
effect: replay
31+
output_expr: |
32+
{
33+
'reason': 'Context trust is insufficient.',
34+
'required_level': 'trusted_3p'
35+
}
Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,56 @@
11
description: "Trust Cascading Policy Tests"
22

33
section:
4-
- name: "Cascading Logic"
4+
- name: "Trust Finding Scenarios"
55
tests:
6-
- name: "Elevation Required (Replay)"
6+
- name: "Critical Compromise (Deny)"
77
input:
8-
agent:
9-
# Note: description is important below. It's used to fetch mocked history content.
8+
agent.context:
109
expr: >
11-
Agent{
12-
description: "trust_cascading_low"
10+
AgentContext{
11+
trust: TrustLevel{
12+
level: "untrusted",
13+
findings: [
14+
Finding{ value: "compromised_session", confidence: 0.95 }
15+
]
16+
}
17+
}
18+
output: >
19+
{
20+
"effect": "deny",
21+
"message": "Critical Trust Failure: Session is potentially compromised."
22+
}
23+
24+
- name: "Unverified Source (Replay)"
25+
input:
26+
agent.context:
27+
expr: >
28+
AgentContext{
29+
trust: TrustLevel{
30+
level: "untrusted",
31+
findings: [
32+
Finding{ value: "unverified_source", confidence: 0.85 }
33+
]
34+
}
1335
}
1436
output: >
1537
{
1638
"effect": "replay",
1739
"details": {
18-
"append_attributes": { "trust_score": "MEDIUM" },
19-
"reason": "Trust elevation required for proper answer."
40+
"reason": "Data source is unverified.",
41+
"action": "verify_provenance"
2042
}
2143
}
2244
23-
- name: "Trust Sufficient (Allow)"
45+
- name: "Trusted Context (Allow)"
2446
input:
25-
agent:
47+
agent.context:
2648
expr: >
27-
Agent{
28-
description: "trust_cascading_medium"
49+
AgentContext{
50+
trust: TrustLevel{ level: "trusted" }
2951
}
3052
output: >
3153
{
3254
"effect": "allow",
33-
"message": "Trust level sufficient."
55+
"message": ""
3456
}

tools/src/test/resources/two_models_contextual.celpolicy

Lines changed: 0 additions & 25 deletions
This file was deleted.

tools/src/test/resources/two_models_contextual_tests.yaml

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)