---
id: change/bcapps/10031
type: change
title: "#10031 Add AI-assisted policy evaluation backend to Expense Agent"
summary: Expense Agent now supports AI-assisted policy evaluation, storing immutable evaluation results for each policy and expense report subject, with new tables, pages, and APIs to track compliance status and enable policy validation at approval.
tier: official
language: en
tags:
  - feature
  - main
  - bc30
  - page exp. report line particip. api
  - page exp. report line per diem api
  - page expense policies api
  - page expense policy evaluations api
  - page expense report line item api
  - page expense report lines api
system: development
review:
  state: reviewed
  by: opus
  at: "2026-10-08T02:07:56.792Z"
  flags: []
generated:
  at: "2026-10-08T01:26:53.141Z"
  pipeline: 0.2.0
  prompts:
    extract-change: 1
  input_hash: 3c2cb4ca91a01cdb15a729758c619db54176f09e
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/pull/10031
    title: "microsoft/BCApps#10031: Add AI-assisted policy evaluation backend to Expense Agent"
    date: "2026-08-21"
    commit: 3c2cb4ca91a01cdb15a729758c619db54176f09e
    t: null
    quote: Expense Agent needs a backend contract for AI-assisted policy evaluation that records both compliant and non-compliant results.
links:
  learn: []
  objects:
    - object/page/6909
    - object/page/6915
    - object/page/7104
    - object/page/7126
    - object/page/6905
    - object/page/6929
    - object/page/6928
    - object/page/7108
    - object/codeunit/7107
    - object/table/7106
    - object/page/6913
    - object/page/7105
    - object/codeunit/6901
    - object/codeunit/6906
    - object/enum/6984
    - object/enum/6989
    - object/enum/6990
    - object/page/7125
    - object/page/7124
    - object/page/7109
    - object/page/7106
    - object/table/7096
    - object/table/7105
    - object/codeunit/6987
    - object/codeunit/6984
    - object/page/6999
    - object/page/6993
    - object/table/6906
    - object/table/6907
    - object/table/6911
    - object/table/6908
    - object/table/6909
    - object/table/6916
    - object/page/6945
    - object/page/7127
    - object/table/7092
    - object/permissionset/6953
    - object/permissionset/6952
    - object/permissionset/6904
    - object/permissionset/6905
    - object/permissionset/6906
    - object/permissionset/6907
    - object/codeunit/6950
    - object/page/6996
    - object/page/6991
    - object/table/6930
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes: []
number: 10031
repo: microsoft/BCApps
source_id: bcapps-prs
url: https://github.com/microsoft/BCApps/pull/10031
kind: pr
base_branch: main
major: "30"
merged_at: "2026-08-21T12:28:51Z"
author: encimita
author_type: User
community_contribution: false
labels:
  - "AL: Apps (W1)"
  - "Team: Integrations"
change_class: code
change_kind: feature
behavior_change: true
breaking: true
files:
  count: 54
  additions: 4067
  deletions: 15
  al: 46
apps:
  - ExpenseAgent
objects_touched:
  - key: page/6909
    page: page/6909
    type: page
    id: 6909
    name: Exp. Report Line Particip. API
    app: ExpenseAgent
    status: modified
  - key: page/6915
    page: page/6915
    type: page
    id: 6915
    name: Exp. Report Line Per Diem API
    app: ExpenseAgent
    status: modified
  - key: page/7104
    page: page/7104
    type: page
    id: 7104
    name: Expense Policies API
    app: ExpenseAgent
    status: added
  - key: page/7126
    page: page/7126
    type: page
    id: 7126
    name: Expense Policy Evaluations API
    app: ExpenseAgent
    status: added
  - key: page/6905
    page: page/6905
    type: page
    id: 6905
    name: Expense Report Line Item API
    app: ExpenseAgent
    status: modified
  - key: page/6929
    page: page/6929
    type: page
    id: 6929
    name: Expense Report Lines API
    app: ExpenseAgent
    status: modified
  - key: page/6928
    page: page/6928
    type: page
    id: 6928
    name: Expense Reports API
    app: ExpenseAgent
    status: modified
  - key: page/7108
    page: page/7108
    type: page
    id: 7108
    name: Exp. Policies To Eval API
    app: ExpenseAgent
    status: added
  - key: codeunit/7107
    page: codeunit/7107
    type: codeunit
    id: 7107
    name: Exp. Policies To Eval Builder
    app: ExpenseAgent
    status: added
  - key: table/7106
    page: table/7106
    type: table
    id: 7106
    name: Exp. Policy To Eval Buffer
    app: ExpenseAgent
    status: added
  - key: page/6913
    page: page/6913
    type: page
    id: 6913
    name: Posted Exp. Report Lines API
    app: ExpenseAgent
    status: modified
  - key: page/7105
    page: page/7105
    type: page
    id: 7105
    name: Posted Policy Evaluations API
    app: ExpenseAgent
    status: added
  - key: codeunit/6901
    page: codeunit/6901
    type: codeunit
    id: 6901
    name: Expense Report Approval Mgmt
    app: ExpenseAgent
    status: modified
  - key: codeunit/6906
    page: codeunit/6906
    type: codeunit
    id: 6906
    name: Expense Capabilities Provider
    app: ExpenseAgent
    status: modified
  - key: enum/6984
    page: enum/6984
    type: enum
    id: 6984
    name: Expense Capability
    app: ExpenseAgent
    status: modified
  - key: enum/6989
    page: enum/6989
    type: enum
    id: 6989
    name: Expense Policy Status
    app: ExpenseAgent
    status: added
  - key: enum/6990
    page: enum/6990
    type: enum
    id: 6990
    name: Expense Policy Subject
    app: ExpenseAgent
    status: added
  - key: page/7125
    page: page/7125
    type: page
    id: 7125
    name: Expense Policy Evaluation Card
    app: ExpenseAgent
    status: added
  - key: page/7124
    page: page/7124
    type: page
    id: 7124
    name: Expense Policy Evaluations
    app: ExpenseAgent
    status: added
  - key: page/7109
    page: page/7109
    type: page
    id: 7109
    name: Posted Exp. Policy Evaluations
    app: ExpenseAgent
    status: added
  - key: page/7106
    page: page/7106
    type: page
    id: 7106
    name: Posted Policy Evaluation Card
    app: ExpenseAgent
    status: added
  - key: table/7096
    page: table/7096
    type: table
    id: 7096
    name: Expense Policy Evaluation
    app: ExpenseAgent
    status: added
  - key: table/7105
    page: table/7105
    type: table
    id: 7105
    name: Posted Exp. Policy Evaluation
    app: ExpenseAgent
    status: added
  - key: codeunit/6987
    page: codeunit/6987
    type: codeunit
    id: 6987
    name: Expense Report-Post
    app: ExpenseAgent
    status: modified
  - key: codeunit/6984
    page: codeunit/6984
    type: codeunit
    id: 6984
    name: Release Exp. Report Document
    app: ExpenseAgent
    status: modified
  - key: page/6999
    page: page/6999
    type: page
    id: 6999
    name: Expense Report SubPage
    app: ExpenseAgent
    status: modified
  - key: page/6993
    page: page/6993
    type: page
    id: 6993
    name: Posted Expense Report SubP.
    app: ExpenseAgent
    status: modified
  - key: table/6906
    page: table/6906
    type: table
    id: 6906
    name: Expense Report Header
    app: ExpenseAgent
    status: modified
  - key: table/6907
    page: table/6907
    type: table
    id: 6907
    name: Expense Report Line
    app: ExpenseAgent
    status: modified
  - key: table/6911
    page: table/6911
    type: table
    id: 6911
    name: Expense Report Line Item
    app: ExpenseAgent
    status: modified
  - key: table/6908
    page: table/6908
    type: table
    id: 6908
    name: Expense Report Line Particip.
    app: ExpenseAgent
    status: modified
  - key: table/6909
    page: table/6909
    type: table
    id: 6909
    name: Expense Report Line Per Diem
    app: ExpenseAgent
    status: modified
  - key: table/6916
    page: table/6916
    type: table
    id: 6916
    name: Posted Expense Report Line
    app: ExpenseAgent
    status: modified
  - key: page/6945
    page: page/6945
    type: page
    id: 6945
    name: Expense Category Card
    app: ExpenseAgent
    status: modified
  - key: page/7127
    page: page/7127
    type: page
    id: 7127
    name: Expense Policies
    app: ExpenseAgent
    status: added
  - key: table/7092
    page: table/7092
    type: table
    id: 7092
    name: Expense Policy
    app: ExpenseAgent
    status: added
  - key: permissionset/6953
    page: permissionset/6953
    type: permissionset
    id: 6953
    name: Expense Agent - Data
    app: ExpenseAgent
    status: modified
  - key: permissionset/6952
    page: permissionset/6952
    type: permissionset
    id: 6952
    name: Expense Agent - Objects
    app: ExpenseAgent
    status: modified
  - key: permissionset/6904
    page: permissionset/6904
    type: permissionset
    id: 6904
    name: Expense Management - Objects
    app: ExpenseAgent
    status: modified
  - key: permissionset/6905
    page: permissionset/6905
    type: permissionset
    id: 6905
    name: Expense Mgmt. Admin
    app: ExpenseAgent
    status: modified
  - key: permissionset/6906
    page: permissionset/6906
    type: permissionset
    id: 6906
    name: Expense Mgmt. Edit
    app: ExpenseAgent
    status: modified
  - key: permissionset/6907
    page: permissionset/6907
    type: permissionset
    id: 6907
    name: Expense Mgmt. Read
    app: ExpenseAgent
    status: modified
  - key: codeunit/6950
    page: codeunit/6950
    type: codeunit
    id: 6950
    name: Expense Agent Privacy Subs.
    app: ExpenseAgent
    status: modified
  - key: page/6996
    page: page/6996
    type: page
    id: 6996
    name: Expense Agent Setup
    app: ExpenseAgent
    status: modified
  - key: page/6991
    page: page/6991
    type: page
    id: 6991
    name: Expense Agent Setup Wizard
    app: ExpenseAgent
    status: modified
  - key: table/6930
    page: table/6930
    type: table
    id: 6930
    name: Expense Agent Setup
    app: ExpenseAgent
    status: modified
objects_unjoined: []
obsoletions: []
backports: []
fixes_issues: []
work_items:
  - 626515
systems:
  - development
quote: Expense Agent needs a backend contract for AI-assisted policy evaluation that records both compliant and non-compliant results.
joined_against:
  major: "30"
  commit: ecbc028c25dbe83b61313bc566e6c1d41184bb1c
---

# #10031 Add AI-assisted policy evaluation backend to Expense Agent

> Expense Agent now supports AI-assisted policy evaluation, storing immutable evaluation results for each policy and expense report subject, with new tables, pages, and APIs to track compliance status and enable policy validation at approval.

[Pull request](https://github.com/microsoft/BCApps/pull/10031) · merged into `main` (BC30) on 2026-08-21 by encimita · 54 files (+4067 -15), 46 AL · feature · tier official · reviewed (checked by Opus)

## What changed

- New Expense Policy Evaluation table stores one immutable result per subject version and policy version, including the policy snapshot, reason, verdict and timestamp
- Expense report lines show a policy status: No Policies, Not Evaluated, Needs Recheck, Flagged or Cleared; currency is derived lazily from versions
- New APIs for policies, policy evaluations, policies to evaluate, posted evaluations and an approval with policy override
- API entities renamed from policy flags to policy evaluations, and flaggedAt is renamed to evaluatedAt
- Approval checks policy currency when Evaluate Policies is enabled; posting copies only current evaluations to the posted table
- Breaking: existing extensions can stop compiling or working.

## AL objects touched

- [Page 6909 "Exp. Report Line Particip. API"](../../objects/page/6909.md), ExpenseAgent: modified
- [Page 6915 "Exp. Report Line Per Diem API"](../../objects/page/6915.md), ExpenseAgent: modified
- [Page 7104 "Expense Policies API"](../../objects/page/7104.md), ExpenseAgent: added
- [Page 7126 "Expense Policy Evaluations API"](../../objects/page/7126.md), ExpenseAgent: added
- [Page 6905 "Expense Report Line Item API"](../../objects/page/6905.md), ExpenseAgent: modified
- [Page 6929 "Expense Report Lines API"](../../objects/page/6929.md), ExpenseAgent: modified
- [Page 6928 "Expense Reports API"](../../objects/page/6928.md), ExpenseAgent: modified
- [Page 7108 "Exp. Policies To Eval API"](../../objects/page/7108.md), ExpenseAgent: added
- [Codeunit 7107 "Exp. Policies To Eval Builder"](../../objects/codeunit/7107.md), ExpenseAgent: added
- [Table 7106 "Exp. Policy To Eval Buffer"](../../objects/table/7106.md), ExpenseAgent: added
- [Page 6913 "Posted Exp. Report Lines API"](../../objects/page/6913.md), ExpenseAgent: modified
- [Page 7105 "Posted Policy Evaluations API"](../../objects/page/7105.md), ExpenseAgent: added
- [Codeunit 6901 "Expense Report Approval Mgmt"](../../objects/codeunit/6901.md), ExpenseAgent: modified
- [Codeunit 6906 "Expense Capabilities Provider"](../../objects/codeunit/6906.md), ExpenseAgent: modified
- [Enum 6984 "Expense Capability"](../../objects/enum/6984.md), ExpenseAgent: modified
- [Enum 6989 "Expense Policy Status"](../../objects/enum/6989.md), ExpenseAgent: added
- [Enum 6990 "Expense Policy Subject"](../../objects/enum/6990.md), ExpenseAgent: added
- [Page 7125 "Expense Policy Evaluation Card"](../../objects/page/7125.md), ExpenseAgent: added
- [Page 7124 "Expense Policy Evaluations"](../../objects/page/7124.md), ExpenseAgent: added
- [Page 7109 "Posted Exp. Policy Evaluations"](../../objects/page/7109.md), ExpenseAgent: added
- [Page 7106 "Posted Policy Evaluation Card"](../../objects/page/7106.md), ExpenseAgent: added
- [Table 7096 "Expense Policy Evaluation"](../../objects/table/7096.md), ExpenseAgent: added
- [Table 7105 "Posted Exp. Policy Evaluation"](../../objects/table/7105.md), ExpenseAgent: added
- [Codeunit 6987 "Expense Report-Post"](../../objects/codeunit/6987.md), ExpenseAgent: modified
- [Codeunit 6984 "Release Exp. Report Document"](../../objects/codeunit/6984.md), ExpenseAgent: modified
- [Page 6999 "Expense Report SubPage"](../../objects/page/6999.md), ExpenseAgent: modified
- [Page 6993 "Posted Expense Report SubP."](../../objects/page/6993.md), ExpenseAgent: modified
- [Table 6906 "Expense Report Header"](../../objects/table/6906.md), ExpenseAgent: modified
- [Table 6907 "Expense Report Line"](../../objects/table/6907.md), ExpenseAgent: modified
- [Table 6911 "Expense Report Line Item"](../../objects/table/6911.md), ExpenseAgent: modified
- [Table 6908 "Expense Report Line Particip."](../../objects/table/6908.md), ExpenseAgent: modified
- [Table 6909 "Expense Report Line Per Diem"](../../objects/table/6909.md), ExpenseAgent: modified
- [Table 6916 "Posted Expense Report Line"](../../objects/table/6916.md), ExpenseAgent: modified
- [Page 6945 "Expense Category Card"](../../objects/page/6945.md), ExpenseAgent: modified
- [Page 7127 "Expense Policies"](../../objects/page/7127.md), ExpenseAgent: added
- [Table 7092 "Expense Policy"](../../objects/table/7092.md), ExpenseAgent: added
- [Permission set 6953 "Expense Agent - Data"](../../objects/permissionset/6953.md), ExpenseAgent: modified
- [Permission set 6952 "Expense Agent - Objects"](../../objects/permissionset/6952.md), ExpenseAgent: modified
- [Permission set 6904 "Expense Management - Objects"](../../objects/permissionset/6904.md), ExpenseAgent: modified
- [Permission set 6905 "Expense Mgmt. Admin"](../../objects/permissionset/6905.md), ExpenseAgent: modified
- [Permission set 6906 "Expense Mgmt. Edit"](../../objects/permissionset/6906.md), ExpenseAgent: modified
- [Permission set 6907 "Expense Mgmt. Read"](../../objects/permissionset/6907.md), ExpenseAgent: modified
- [Codeunit 6950 "Expense Agent Privacy Subs."](../../objects/codeunit/6950.md), ExpenseAgent: modified
- [Page 6996 "Expense Agent Setup"](../../objects/page/6996.md), ExpenseAgent: modified
- [Page 6991 "Expense Agent Setup Wizard"](../../objects/page/6991.md), ExpenseAgent: modified
- [Table 6930 "Expense Agent Setup"](../../objects/table/6930.md), ExpenseAgent: modified

## Context

- Work items: AB#626515
- Labels: AL: Apps (W1), Team: Integrations
- Systems: development
- From the description: "Expense Agent needs a backend contract for AI-assisted policy evaluation that records both compliant and non-compliant results."

Source: metadata of a merged pull request in microsoft/BCApps (bcapps): title, labels, changed paths and counts, with a summary in our words. No source text and no description beyond one short quote (D10, D61).
