Skip to content

feat(policy): MVP PolicyEvaluator (closes #21)#55

Merged
leo-aa88 merged 1 commit into
mainfrom
issue/21-policy-evaluator
Apr 12, 2026
Merged

feat(policy): MVP PolicyEvaluator (closes #21)#55
leo-aa88 merged 1 commit into
mainfrom
issue/21-policy-evaluator

Conversation

@leo-aa88
Copy link
Copy Markdown
Member

Summary

Implements the policy engine MVP from issue #21 and design doc section 12.2 H: run/step/tool checks for wall-clock budget, cost ceiling, structured output requirement, unknown tools, and approval-gated tool actions.

API

  • PolicyEvaluator: CheckRun, CheckStep, CheckToolCall (matches design doc interface).
  • RunContext: Elapsed, AccumulatedCostUSD, ApprovedActions (slice of full uses strings, intended to be filled from repeated --approve <action> when agentctl run exists).
  • Engine: Evaluator(policyName) resolves Policy specs from the graph; EvaluatorForSpec for explicit merged specs (e.g. env overrides later).
  • DeniedError: stable reason constants + TraceData() for trace.EventPolicyDenied.

Helpers (as requested)

File Role
budget.go Max wall clock, max total cost, structured output gate
permissions.go forbidUnknownTools via tools.ParseUses + graph Tools
approvals.go approvals.requiredFor exact match on uses vs ApprovedActions

Tests

  • Unknown tool with forbidUnknownTools: true*DeniedError (unknown_tool).
  • Approval-required uses without a matching approved action → denial; TraceData appended as policy.denied via SQLite + trace.Recorder, then read back.
  • Extra coverage: known tool OK, --approve-style slice allows call, wall clock / cost / structured output denials, Engine.Evaluator named policy resolution.

Verification

  • make fmt
  • make vet
  • make test (-race)

Notes

  • CLI run is not wired yet; RunContext.ApprovedActions defines the contract for repeated --approve values matching YAML requiredFor entries (e.g. tool.github.pull_request.merge).

Closes #21

Made with Cursor

- Add PolicyEvaluator: CheckRun (wall clock, cost), CheckStep (structured
  output), CheckToolCall (forbidUnknownTools, approval-required actions)
- Split helpers: budget, permissions (uses tools.ParseUses), approvals
- DeniedError with TraceData for trace.EventPolicyDenied
- Engine resolves named Policy resources from the project graph

RunContext carries elapsed time, accumulated cost, and approved actions
(for future repeated --approve on agentctl run).

Closes #21

Made-with: Cursor
@leo-aa88 leo-aa88 merged commit 9d35011 into main Apr 12, 2026
4 checks passed
@leo-aa88 leo-aa88 deleted the issue/21-policy-evaluator branch April 12, 2026 01:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[MVP] Policy evaluator MVP (internal/policy)

1 participant