feat(platform): close AI expense value loop

Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
caoxiaozhu
2026-07-17 14:14:08 +08:00
parent 242d68c36f
commit 787bc3a481
507 changed files with 82072 additions and 6344 deletions

View File

@@ -0,0 +1,9 @@
## 修复记录
- 18:14记录 bug 修复Agent Run 详情绕过财务看板权限暴露跨租户快照与工具响应。
- Git 提交检查18:13 执行 `git fetch --all --prune``HEAD..origin/main` 无新提交,本地比 `origin/main` ahead 17 个提交,范围为 `661990b2 feat(expenses): add transactional expense case events``242d68c3 feat(approval): add task workflow and waiver decisions`,本次未合并或改写这些提交。
- 修改:新增 `agent_run_access_policy.py`,识别 `finance_dashboard_snapshot` 运行记录并同时核对 route/ontology 中的 `tenant_id``data_scope` 及当前用户财务角色;两份范围标签缺失、不一致、跨租户或与当前数据范围不符时一律 fail-closed。
- 修改:`agent_runs.py` 在列表返回前过滤无权查看的财务快照,在详情返回 `snapshot_payload`、工具请求和工具响应前执行同一访问策略;跨租户(包括其他租户 admin按 404 处理,同租户普通用户按 403 处理,只有同租户 `finance``executive` 或 admin 能读取完整快照。
- 操作:在 `test_finance_dashboard_tenant_security.py` 构造 tenant-a、tenant-b、无租户旧快照和损坏 data scope 快照,覆盖列表、详情、普通用户、财务用户和跨租户管理员路径;所有命令均在 `local-x-financial-linux` 容器执行。
- 验证Ruff 检查与格式检查通过财务看板、Agent Run 服务和 Ontology 端点定向回归共 17 个测试通过,证明合法同租户详情仍可读取,跨租户载荷、无范围旧记录和损坏范围记录均不可见。
- 影响:已登录用户不能再通过猜测或复用 `run_id` 绕过财务看板领域权限读取其他租户的报销金额快照和工具调用明细,列表入口也不会泄露这些快照的摘要记录。

View File

@@ -0,0 +1,8 @@
## 修复记录
- 22:33记录 bug 修复Agent Run 轻量列表遗漏语义解析结果。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..@{u}` 为空,未发现 upstream 新提交;本地 `main` ahead 17。审批链相关提交为 `242d68c3``28b834ed``4940ebc4`AI 报销学习与申请链相关提交为 `ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6`,费用事件与事务链相关提交为 `5ed34c2b``1347366b``22669a90``a616b30c``661990b2`,另有迁移安全 `11275e4b` 与会话鉴权 `653eda05`;这些均为当前任务开始前已有的本地提交,本次没有改写或合并。
- 修改:在 `agent_run.py` 的轻量仓储查询中按列表已经筛选出的 run_id 批量读取每个 Run 的首条语义解析;在 `agent_runs.py` 中恢复 `AgentRunRead.semantic_parse` 的既有列表契约,同时保留工具调用和大 JSON 字段的轻量预览策略。
- 操作:先在容器复现 seeded trace 用例失败,再核对 foundation seed、详情序列化和前端消费字段没有修改 seed fixture 来掩盖列表序列化断层。
- 验证:容器内 `test_agent_runs_service.py``test_agent_run_tenant_security.py``test_agent_trace_service.py` 与 OnlyOffice 定向测试共 11 项通过;`test_agent_asset_service.py` 全部 28 项通过;相关实现文件 Ruff 与 `git diff --check` 通过。
- 影响Agent Run 列表重新携带真实语义解析摘要seeded trace、运行轨迹界面和依赖 `semantic_parse` 的流程可继续使用;补充查询仅以租户过滤后的 run_id 为输入,不扩大数据作用域。

View File

@@ -0,0 +1,11 @@
## 修复记录
- 22:10记录 bug 修复Agent Run 普通日志跨租户读取与统计泄露。
- Git 提交检查22:10 执行 `git fetch --all --prune``HEAD..origin/main` 无新提交,本地比 `origin/main` ahead 17 个提交,范围为 `661990b2 feat(expenses): add transactional expense case events``242d68c3 feat(approval): add task workflow and waiver decisions`,本次未合并或改写这些既有提交。
- 修改:`agent_run.py` repository 将 `route_json.tenant_id``ontology_json.tenant_id` 的双重一致性条件下推到 SQL在排序和 `limit` 前完成租户过滤;任一标记缺失、空作用域或两处标记冲突的记录均 fail-closed详情也在数据库查询阶段按租户收窄。
- 修改:`agent_runs.py` service 新增显式的租户级列表、统计和详情入口,保留带注释的受信任内部跨作用域入口;`agent_run_access_policy.py` 增加返回前二次租户校验,并把财务快照的角色与 `data_scope` 门禁同步下推,防止不可见快照挤占列表和统计窗口。
- 修改Agent Run API 的列表、统计和详情统一使用当前认证租户;普通 run 的跨租户详情、无作用域旧记录和冲突标记记录均返回 404跨租户管理员也没有旁路工具 `request_json`/`response_json`、语义 `raw_query` 与错误统计不会跨租户暴露。
- 修改:`create_run` 支持显式 `tenant_id` 并同时写入 route/ontology后续整体更新或 route 合并会保留已验证的双重标记发现调用方已有冲突标记时拒绝写入Orchestrator、Ontology、知识同步和财务快照的认证/租户感知创建路径已传入可信 tenant知识同步的活动任务复用也改为租户内查询。
- 操作:新增 `test_agent_run_tenant_security.py`,构造 tenant-a、tenant-b、无作用域、冲突作用域和同租户财务快照覆盖 limit 前过滤、列表、统计、详情、跨租户 admin 及敏感载荷反向断言;全部命令均在 `local-x-financial-linux` 容器内以 60 秒超时执行。
- 验证Agent Run、财务快照、Ontology 端点、Orchestrator 认证和知识服务定向回归 31 个测试通过;核心变更文件 Ruff、`git diff --check`、PostgreSQL 方言 SQL 编译与代码行数检查通过,最大核心文件 `agent_runs.py` 为 760 行,低于 800 行硬上限。额外 Ontology 全文件回归共 82 个通过、4 个既有业务信号识别用例失败,失败堆栈位于未由本次改动触碰的 `_has_supported_business_signal` 判定。
- 影响Agent Run 日志现在以认证租户为强边界,其他租户、历史无归属记录及损坏作用域记录不再进入列表、统计或详情响应,同时保留内部后台任务按明确可信入口读取的兼容性。

View File

@@ -0,0 +1,8 @@
## 修复记录
- 19:19修复 AI 报销申请预检的阻断提示与既有交互文案契约不一致问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`aiApplicationPrecheckModel.js` 将受限状态和证据快照提示统一为“请先检查”“请先核对”,恢复动作前置关系并与页面测试契约一致。
- 操作:检查在 `local-x-financial-linux` 容器内执行,未修改财务规则 XLSX。
- 验证AI 申请预检模型定向前端回归 `4 passed`
- 影响:用户在提交前能清楚理解必须先完成的检查动作,避免因提示语义弱化而误以为可直接继续。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 19:01修复一个 AI 决策关联多条工作流结果后,原申请动作幂等重放可能命中多行的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,从 `661990b2 feat(expenses): add transactional expense case events``242d68c3 feat(approval): add task workflow and waiver decisions`,其中包含认证、费用 Case、AI 反馈/记忆、迁移安全、预审、风险处置和审批任务能力;本次未拉取、合并或改写这些历史。
- 修改:`ExpenseApplicationLearningService._find_existing()` 不再按 `decision_id` 使用可返回多行的无序 scalar 查询,而是根据原始动作的租户、幂等键和稳定 UUID 精确取回首次 Feedback/Outcome并二次校验租户与 Decision 关联。
- 修改:工作流结果桥接只关联事件发生前最新的已提交 AI Decision原动作重放只回填同 correlation 的预审结论,不会把后续重新提交的退回或审批结果污染到旧决策。
- 操作:在 `local-x-financial-linux` 容器中使用 `/tmp/x-financial-server-venv` 运行 Ruff 和 AI 预览/工作流学习回归;未在宿主机执行 Python 或 pytest。
- 验证:`test_expense_application_preview_decisions.py``test_expense_workflow_learning.py` 组合回归 `17 passed`;新用例验证第二次提交后的退回仅关联最新 Decision多 Outcome/Feedback 不影响原请求重放。
- 影响:申请动作重试不再因后续付款、退回或审计结果增多而出现多行异常,也不会将新一轮流程结果错标到历史 AI 建议上。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 19:09修复 CFO 价值看板允许发起无证据手工实际结果、与后端证据门禁冲突的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`CfoValueOpportunityDrawer.vue` 过滤 `record_realization` 空证据入口并明确提示实际结果必须来自平台付款事件或可追溯的支付、银行、ERP 凭证;`CfoValueActionDialog.vue` 删除不可履行证据要求的手工金额表单;`useCfoValueDashboard.js` 增加防御性拒绝,避免旁路重新提交空证据。
- 修改:`cfo-value-dashboard.test.mjs` 将序列化样例改为带外部凭证的请求,并增加前端不暴露空证据登记入口的回归断言。
- 操作:全部检查均在 `local-x-financial-linux` 容器内执行,未修改财务规则 XLSX 或历史开发文档。
- 验证CFO/应用壳/财务看板组合前端回归 `22 passed`Vite 生产构建成功(`2227 modules transformed``built in 5.08s``git diff --check -- web` 通过。
- 影响:用户不会再遇到“页面允许登记、后端必然拒绝”的假动作;在真实连接器或凭证上传入口接入前,现金节省仍只能依靠可信付款事件落账并由独立财务确认。

View File

@@ -0,0 +1,8 @@
## 修复记录
- 21:40记录 bug 修复:定价毛利率边界舍入越过后端上限。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新增提交;本地 `main` ahead 17 个既有提交,分别为 `242d68c3` 审批任务流、`28b834ed` 不可变动作回放、`4940ebc4` 风险处置、`ee88a36b` 分层费用学习、`6bdf65bc` 权威预审、`ae3f02c3` 零录入票据关联、`54754b55` 个人申请记忆、`211f85d9` 统一申请流、`5b246307` 申请预览决策、`a662cfe6` 申请反馈台账、`5ed34c2b` 历史申请回填、`11275e4b` 迁移归属校验、`1347366b` 费用时间线与草稿事件、`22669a90` 统一费用事件时间线、`a616b30c` AI 申请事务、`653eda05` bearer 会话和 `661990b2` 费用案例事件;均非本次修复产生。
- 修改:`commercialWorkspaceModel.js` 先把百分比量化为后端允许的六位小数,再校验目标贡献毛利率严格小于 `0.95``CommercialPricingScenarioPanel.vue` 同步把可输入上限收紧到 `94.9999%`,并在模型测试中覆盖舍入临界值。
- 操作:在容器 `local-x-financial-linux` 内执行边界探针、商业模型与组件定向测试、全量前端测试、code-size 门禁和 Vite production build。
- 验证:临界探针确认 `94.9999%` 序列化为 `0.949999``94.999999%` 在请求前被拒绝;商业定向测试 35 项通过,修复后的模型与组件回归 28 项通过,全量前端 802 项通过code-size 通过Vite 完成 2246 个模块转换。
- 影响:管理员无法再提交一个表面小于 95%、但六位小数量化后等于后端禁值 `0.95` 的场景,避免无意义的 422 往返,同时不改变合法目标毛利率的精度。

View File

@@ -0,0 +1,8 @@
## 修复记录
- 21:09记录 bug 修复:未配置硬配额被前端误显示为剩余 0。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新增提交;本地 `main` ahead 17 个既有提交,分别为 `242d68c3` 审批任务流、`28b834ed` 不可变动作回放、`4940ebc4` 风险处置、`ee88a36b` 分层费用学习、`6bdf65bc` 权威预审、`ae3f02c3` 零录入票据关联、`54754b55` 个人申请记忆、`211f85d9` 统一申请流、`5b246307` 申请预览决策、`a662cfe6` 申请反馈台账、`5ed34c2b` 历史申请回填、`11275e4b` 迁移归属校验、`1347366b` 费用时间线与草稿事件、`22669a90` 统一费用事件时间线、`a616b30c` AI 申请事务、`653eda05` bearer 会话和 `661990b2` 费用案例事件;均非本次修复产生。
- 修改:`commercialWorkspaceModel.js` 的数值规范化显式把 `null``undefined` 和空字符串保留为“未知”,不再依赖 JavaScript 的 `Number(null) === 0` 隐式转换。
- 操作:在容器 `local-x-financial-linux` 内运行商业服务、模型和 Vue 组件定向 Node 测试。
- 验证:商业服务、模型和组件定向测试共 28 项通过;全量 `web/tests/*.test.mjs` 共 795 项通过;`code-size-limits` 通过Vite production build 完成 2233 个模块转换。权益测试同时覆盖不限量、未配置硬上限和失败关闭状态。
- 影响:真实硬配额为 0 时仍显示 0未配置硬配额时显示“未配置硬上限”避免管理员把未知配置误判为已耗尽配额。

View File

@@ -0,0 +1,11 @@
## 修复记录
- 19:37修复商业分析 ROI 口径、商业合同可见角色和已消费权益历史可变三类问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`commercial_analytics.py` 将客户现金 ROI 统一为“(财务确认现金节省-客户合同收费代理值)/ 客户合同收费代理值”,并把 ratio numerator 改为净收益;禁止截止时间早于窗口开始及无时区分析时间。
- 修改:`commercial_access_policy.py` 移除直属经理对套餐、订阅和配额的默认读取权限仅保留财务、executive 和平台管理员。
- 修改:`commercial_admin.py` 在权益已有用量后禁止回改配额、计价配置和有效期,只允许暂停/恢复;完全相同的 PUT 不再无意义增加版本。
- 修改:`commercial.py` 强制套餐、订阅、权益、用量和成本事实时间显式带时区,避免跨时区账期歧义。
- 操作:全部检查均在 `local-x-financial-linux` 容器内执行,未修改财务规则 XLSX 或历史开发文档。
- 验证:商业模型、服务与 HTTP 定向回归 `10 passed`;相关 Ruff 检查通过。
- 影响:商业 ROI 与既定合同口径一致,普通直属经理不能查看敏感商业合同,历史用量不会因事后回改权益配置而改变含义。

View File

@@ -0,0 +1,23 @@
## 修复记录
- 21:56记录 bug 修复:非成功 Agent 工具调用可能被商业账本误计量。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新增提交;本地 `main` ahead 17 个既有提交,分别为 `242d68c3` 审批任务流、`28b834ed` 不可变动作回放、`4940ebc4` 风险处置、`ee88a36b` 分层费用学习、`6bdf65bc` 权威预审、`ae3f02c3` 零录入票据关联、`54754b55` 个人申请记忆、`211f85d9` 统一申请流、`5b246307` 申请预览决策、`a662cfe6` 申请反馈台账、`5ed34c2b` 历史申请回填、`11275e4b` 迁移归属校验、`1347366b` 费用时间线与草稿事件、`22669a90` 统一费用事件时间线、`a616b30c` AI 申请事务、`653eda05` bearer 会话和 `661990b2` 费用案例事件;均非本次修复产生。
- 修改:`commercial_runtime_policy.py` 把工具调用状态明确分为可计量、采集中和不可计量;`commercial_runtime_metering.py` 只允许 `succeeded/success/ok/completed` 的真实终态调用进入用量与成本账本,`running/pending/queued` 保留待终态补偿语义,`blocked/failed/skipped/cancelled` 不再产生商业事实。同步用 `commercial_runtime_bridge.py` 将未配置租户兼容放行、显式配置后的执行前配额门禁、成功调用后的幂等追加和故障补偿接入真实 `AgentToolCall` 生命周期。
- 操作:在 `AgentRunService` 的创建与终态更新后触发桥接计量;在中央工具执行器调用真实 executor 前执行权益预检;将工具执行职责拆到 `orchestrator_tool_execution.py`,让核心编排文件回落到 762 行;所有命令均在 `local-x-financial-linux` 容器内运行并设置 60 秒超时。
- 验证:商业运行计量 17 项通过,商业模型/服务/接口/运行计量合计 28 项通过AgentRun 与 Orchestrator 鉴权相关回归合计 34 项通过;范围内 Ruff、`compileall`、diff 检查和类级 800 行检查通过。全库 code-size 门禁仍被本次范围外的 `RiskRuleGenerationService` 817 行阻断,未在本修复中改动该类。
- 影响:未成功完成的工具调用不会再消耗客户配额或形成内部成本;未配置商业计量的既有租户继续执行;已配置租户在执行前受配额约束。计量系统故障时真实工具调用记录保持不变,返回 `requires_reconciliation` 并可按同一工具调用 ID 幂等重试,避免把计量失败伪装成已入账。
- 22:31修复执行前只读配额在并发下可超卖、直接调用绕过预占及补偿误判问题。
- Git 提交检查:再次执行 `git fetch --all --prune``git status -sb``git log HEAD..@{u}``git log @{u}..HEAD`;上游无新增提交,本地仍 ahead 17 个既有提交:`242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`,均非本次修复产生。
- 修改:新增 `commercial_runtime_reservations` 运营占位及 `0019` 迁移;在订阅、权益行锁内按“已用量 + 有效预占 + 本次预占”原子校验硬配额。中央 Orchestrator 先生成稳定 tool call ID 并预占,再执行真实工具;成功且真实量不超过预占才追加用量/成本并提交,失败或阻断释放,变量基准没有执行器 hard max 时失败关闭。
- 修改:新增持久 `reconciliation_required` 和过期补偿器。缺少执行前预占的旧直接调用不再静默补写正常用量,而是冻结对应容量;补偿器仅在真实工具成功、失败或运行已终止且无调用时结算/释放,运行中或来源不确定继续保留。修复历史过期订阅/权益错误启用门禁、无租户旧运行错误进入补偿、相同预占重试被自身占位判定为额度耗尽三个边界。
- 操作:拆出运行时成本解析、周期键、标量校验、预占和补偿模块,相关核心类均低于 800 行更新模型注册、迁移所有权、前置检查、商业配额投影、AgentRun/中央工具调用点和迁移/并发/补偿测试。所有 Python、Alembic 和 PostgreSQL 验证均在 `local-x-financial-linux` 容器内以 60 秒超时执行。
- 验证:运行时定向 25 项通过商业、Agent、权限、迁移组合 140 项通过;一次性 PostgreSQL 17 商业并发 4 项通过,两个线程竞争一份硬配额时只有一个预占成功;全新 PostgreSQL 0019→0020 完整 Alembic 升降级循环 1 项通过;范围内 Ruff、`compileall``git diff --check` 和相关类 800 行检查通过。Orchestrator review 套件保持既有 5 项本体/申请流失败、11 项通过;全库 code-size 仍仅被范围外 `RiskRuleGenerationService` 817 行阻断。
- 影响:商业硬配额从“执行前提示”升级为数据库原子 permit真实工具并发不能再穿透上限成功事实可幂等结算计量或成本故障保留可补偿状态且不伪造成功未配置 runtime meter 的路径继续兼容,历史失效配置不会误拦截用户。
- 22:39修复“用量已提交、成本写入失败”缺少持久补偿身份的问题。
- Git 提交检查:再次执行 `git fetch --all --prune``git status -sb``git log HEAD..@{u}``git log @{u}..HEAD`;上游仍无新增提交,本地仍 ahead 17 个既有提交:`242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`,均非本次修复产生。
- 修改:为运行时预占增加 `committed_reconciliation_required` 状态。真实用量已经追加但内部成本失败时,保留真实数量、结算时间和失败原因并进入补偿队列;按同一 tool call 重试只幂等补写成本,成功后恢复 committed。该状态不再计入有效预占避免真实用量和冻结量重复消耗配额。
- 修改:直连调用发生后若当前唯一匹配合同已暂停,允许补偿记录绑定原订阅/权益快照并进入 `reconciliation_required`;正常执行前 reserve 仍严格要求 active/trialing 订阅和 active 权益,不放宽真实执行许可。
- 验证:容器内运行时定向 27 项、商业/Agent/权限/迁移组合 183 项通过,另 1 项因未显式配置外部迁移库跳过;全新 PostgreSQL 完整迁移循环 1 项、商业并发 4 项通过。成本故障用例验证 `used=1``reserved=0`,重试后用量仍为 1 且只新增 1 条成本;范围内 Ruff 通过。
- 影响:成本账本短暂故障不再只依赖日志发现,也不会让客户额度被重复扣减;暂停发生与工具终态竞态时,已发生业务仍有持久、租户隔离的补偿证据。

View File

@@ -0,0 +1,17 @@
## 修复记录
- 17:11记录 bug 修复:财务看板跨租户聚合、快照串租户复用与普通用户越权读取。
- Git 提交检查:执行 `git fetch --all --prune` 后未发现 `HEAD..origin/main` 新提交;本地比 `origin/main` ahead 17 个提交,最新为 `242d68c3 feat(approval): add task workflow and waiver decisions`,其余为 `28b834ed``661990b2` 的审批、费用闭环、AI 记忆、迁移安全和认证能力提交,本次没有合并或改写这些历史。
- 修改:`finance_dashboard.py` 通过 `ExpenseClaimTenantScopeMixin` 按 Expense Case Link 聚合当前租户报销单;缺少 `tenant_id` 的旧预算表仅允许 `default` 租户读取,其他租户返回带原因的明确空预算;新增 `finance_dashboard_scope.py` 统一声明报销与预算数据范围。
- 修改:`finance_dashboard_snapshot.py``tenant_id`、数据范围和完整时间参数纳入无歧义缓存键,并在 SQL 查询、Agent Run 路由及工具请求中同时校验租户和范围;`finance_dashboard_scheduler.py` 显式固定 `default` 系统租户,非默认租户不能调用默认定时快照入口。
- 修改:新增 `finance_dashboard_access_policy.py``analytics.py` 显式接收 `CurrentUserContext`,仅允许 `finance``executive` 或 admin 只读访问财务看板,普通用户和仅有 `budget_monitor` 角色的用户返回 403。
- 操作:所有检查均在 `local-x-financial-linux` 容器内执行;新增租户 A/B、default 历史单、旧预算、快照缓存与接口权限测试,没有触碰受保护的财务规则 XLSX 和历史开发文档。
- 验证Ruff 对本次 7 个 Python 模块及新增测试检查通过;`test_finance_dashboard_tenant_security.py``test_finance_dashboard_service.py` 共 8 个测试通过。补充运行财务报告与数字员工回归时 4 个测试通过、1 个既有财务周报用例失败,原因是用例将“当前时间减 2 天”的数据断言进“上一完整周”窗口,和本次租户过滤无关。
- 影响:财务看板不再读取其他租户的报销单或把 default 旧预算暴露给非默认租户;相同时间参数的租户快照不会互相命中,后台默认快照和前台读取权限也有了可审计的显式边界。
- 18:14补齐财务看板租户 fail-closed 边界与模块拆分验证。
- Git 提交检查18:13 再次执行 `git fetch --all --prune``HEAD..origin/main` 无新提交,本地仍比 `origin/main` ahead 17 个提交,范围为 `661990b2 feat(expenses): add transactional expense case events``242d68c3 feat(approval): add task workflow and waiver decisions`,未合并、改写或覆盖这些提交及工作区内其他智能体改动。
- 修改:`finance_dashboard_access_policy.py` 对空白租户上下文直接拒绝,避免异常认证上下文回落到 default将预算摘要、预算卡片和预算瓶颈投影提取到 `finance_dashboard_budget.py``finance_dashboard.py` 从 920 行降至 746 行,保持租户过滤和原 API 不变。
- 操作:只在 `local-x-financial-linux` 容器内执行 Ruff、财务看板服务与接口测试、Agent Run 服务回归和 Ontology 端点回归;未触碰财务规则 XLSX、Savings 迁移或前端文件。
- 验证Ruff 检查与格式检查通过财务看板、Agent Run 服务和 Ontology 端点定向回归共 17 个测试通过。另跑数字员工、系统看板和财务报告回归时 6 个通过、1 个既有周报窗口用例失败;该用例在周四写入“当前时间减 2 天”的单据,却断言它属于“上一完整周”,失败与本次改动无关。
- 影响:租户身份缺失时财务看板不再隐式读取 default 数据;预算展示职责被独立封装,后续继续扩展财务指标时不会把核心聚合模块推过项目 800 行硬上限。

View File

@@ -0,0 +1,11 @@
## 修复记录
- 22:29记录 bug 修复非生产财务回执会进入核心付款状态机连接器配置缺少版本化生命周期审计normalized payload 冗余保存完整单号。
- Git 提交检查:执行 `git fetch --all --prune` 后未发现 `HEAD..origin/main` 新提交;当前 `main` 相对 `origin/main` ahead 17范围为 `661990b2..242d68c3`包含认证、费用事件、AI 学习、审批任务/风险处置和迁移所有权等既有基础提交,本轮未合并或改写这些提交。
- 修改:`financial_connector_ingestion.py` 与新增 `financial_connector_simulation.py` 将 test/mock/staging 六类事件收口为 `simulation_only` 只读事实,禁止修改 Claim、对账、ERP、Business Event、归档和 Savings生产 origin 查询只接受同来源生产事实,不能引用模拟结算触发冲回。
- 修改:`financial_connector_config_lifecycle.py``financial_connector_config_audit.py`、配置 schema/API 和 `FinancialConnectorConfigEvent` 新增带 expected version、认证 actor、request ID、reason 的 activate/disable/rotate 状态机;新配置只能 disabled 创建,激活/轮换前解析服务端 `secret_ref` 并校验 HMAC 密钥强度,审计前后快照不保存密钥引用或明文。
- 修改:`20260716_0020_financial_connector_config_lifecycle.py` 基于 0019 增加配置 version、复合租户约束和 PostgreSQL append-only 审计 trigger受控移除历史 connector event normalized payload 中的完整 `claim_reference`,保留金额/币种、必要尾号和内容指纹,并把可能已有旧非生产副作用的响应标记为 `legacy_nonproduction_effect_unknown`,不伪装为新策略下的无副作用模拟事实。
- 修改:保留并验证 HMAC v2 对 tenant/provider/key version/timestamp/method/path 的绑定拒绝共享密钥跨来源重放ERP 回执按协议只要求 origin、Claim、金额和币种不再错误强制重复支付参考号空白密钥即使长度足够也按强度不足失败关闭。
- 操作:在独立一次性 PostgreSQL 17 容器完成空库升级到 0020、schema/约束/trigger 探针、并发激活单版本胜者、0019→0020 历史脱敏探针和完整升降级循环验证完成后删除临时容器。同步更新模型注册、迁移所有权、preflight、HEAD revision、迁移断言及连接器 CONCEPT/TODO。
- 验证:容器内连接器/配置/费用价值链/迁移组合回归 `140 passed, 1 skipped`PostgreSQL 连接器并发 `3 passed`;全新 PostgreSQL 完整迁移循环 `1 passed`,商业迁移 agent 在另一空库复跑同样 `1 passed`Ruff、全树 `git diff --check` 均通过,连接器核心文件最大 509 行,低于 800 行硬上限。
- 影响:模拟、测试和预发布环境现在可以安全演练完整事件协议而不会改账;只有 `production_verified` 且精确匹配的回执能够推进付款、ERP 与 Savings。管理员可以安全激活、停用和轮换密钥所有配置动作可追溯且不泄露密钥或完整单号。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 19:01修复风险规则 Golden 评测的 FP/FN 统计颠倒、修订版本未进门禁以及异常/空用例默认放行问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`risk_rule_golden_evaluator.py` 将 false positive 改为“期望不命中但实际命中”false negative 改为“期望命中但实际未命中”Precision/Recall 分母恢复正确。
- 修改:初次发布和 revision 发布均强制执行 Golden 门禁;缺规则文档、缺 rule code、缺 active Golden case 或评测异常均 fail-closed。仅当 `GOLDEN_SET_GATE_ENABLED=false` 被显式配置时允许跳过,且仍写入 status=skipped 的 `AgentAssetTestRun`
- 操作:在 `local-x-financial-linux` 容器中运行 Golden、发布、修订和安全自动化定向回归并执行 Ruff未修改财务规则 XLSX。
- 验证Golden、release guard 和自动化资格组合回归 `29 passed`;并行定向发布/修订回归纳入总计 `62 passed`,评测异常、空用例和缺配置均留下 failed 记录并拦截发布。
- 影响误报不再被错计为漏报Precision/Recall 可用于可信的 Canary 与回滚判断;新规则和修订规则不能因评测器失败或没有黄金用例而静默上线。

View File

@@ -0,0 +1,8 @@
## 修复记录
- 22:33记录 bug 修复OnlyOffice 回调测试仍 patch 已拆分前的网络符号。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..@{u}` 为空,未发现 upstream 新提交;本地 `main` ahead 17。审批链相关提交为 `242d68c3``28b834ed``4940ebc4`AI 报销学习与申请链相关提交为 `ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6`,费用事件与事务链相关提交为 `5ed34c2b``1347366b``22669a90``a616b30c``661990b2`,另有迁移安全 `11275e4b` 与会话鉴权 `653eda05`;这些均为当前任务开始前已有的本地提交,本次没有改写或合并。
- 修改:把 `test_onlyoffice_callback_summary.py` 的网络 patch 目标切换到实际查找符号的 `agent_asset_onlyoffice` 模块,并删除对旧版本元数据方法及“回调自行生成 change_note”的过期假设测试现在验证下载内容、回调用户和 `onlyoffice` 来源被完整委托给统一上传流程。
- 操作:没有在 `agent_assets` 中恢复底层 `urlopen` 兼容导出,因为该符号不是公共 API且兼容别名也无法拦截拆分模块中的真实调用差异摘要仍由 `upload_rule_spreadsheet` 统一生成和审计,已有服务测试覆盖其工作表/单元格统计。
- 验证:容器内回调定向测试通过;包含该测试的 Agent Run/租户/轨迹组合共 11 项通过,`test_agent_asset_service.py` 全部 28 项通过;测试文件 Ruff 与 `git diff --check` 通过。
- 影响OnlyOffice 回调测试重新拦截真实网络边界,不会发出外部请求,也不会因内部模块拆分误报;生产回调与摘要生成职责保持不变。

View File

@@ -0,0 +1,12 @@
# 报销审批非参与者错误映射与陈旧测试契约
日期2026-07-16
文档路径document/development/2026-07-16/dev-logs/bugs/reimbursement-approval-task-access-error-mapping.md
## 修复记录
- 21:38记录 bug 修复报销审批非参与者错误映射与陈旧测试契约。bug-log:242d68c3
- Git 提交检查:已手工执行 `git fetch --all --prune`upstream `origin/main` 无本地尚未包含的新提交;当前分支 ahead 17 且工作区已有其他智能体和用户的未提交改动因此未自动合并或变基。ahead 包括审批任务与风险链 `242d68c3``28b834ed``4940ebc4`AI/费用学习与预审链 `ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6`Expense Case/时间线与事务链 `5ed34c2b``1347366b``22669a90``a616b30c``661990b2`,以及迁移安全 `11275e4b`、认证会话 `653eda05`
- 修改:`reimbursement_approval_actions.py` 将审批任务访问策略抛出的 `LookupError` 显式映射为 404避免非任务参与者通过报销审批/退回接口触发 500`test_expense_claim_service.py``test_reimbursement_endpoints.py` 同步到正式审批任务的资源隐藏与任务冲突契约,并增加申请人审批、退回均无状态和动作账本副作用的 HTTP 回归。
- 操作:完整读取 `agent-change-log` Skill沿 `ExpenseClaimActionProtocolMixin → ApprovalTaskLifecycleService → ApprovalTaskAccessPolicy` 诊断调用链;保留“非参与者不可读取任务”的权限语义,没有放宽审批人、管理员、申请人或租户边界;随后运行日志 helper 创建本记录并补齐实际证据。
- 验证:在 `local-x-financial-linux` 容器中,原失败用例与新增 HTTP 用例 2 项通过;审批任务、审批路由和报销接口组合 65 项通过;费用服务审批、退回和付款相关筛选回归 30 项通过;相关 Python 文件 Ruff F/I 检查通过。
- 影响:申请人或其他非任务参与者调用审批动作时稳定返回 404不再出现服务端 500也不会创建动作账本、审批事件或修改 Claim可见但不可操作的任务仍按既有策略返回 403状态/版本冲突继续返回 409。

View File

@@ -0,0 +1,27 @@
# AI 发布门禁全局资产越权与快照损坏静默放行
## 修复记录
- 19:48记录 AI 分阶段发布的租户越权与运行时完整性失效修复。
- Git 提交检查:执行 `git fetch --all --prune` 后未发现 `HEAD..origin/main` 上游新提交;本地 `main` 比上游 ahead 17最新为 `242d68c3 feat(approval): add task workflow and waiver decisions`其余为审批安全、AI 费用学习、报销预审、迁移安全与会话认证等既有检查点,本次未合并或改写这些提交。
- 修改:`agent_asset_release_guard.py` 为所有发布查询、启动、评测、晋级和回滚入口增加平台全局资产管理边界;未绑定租户的共享资产只允许平台管理员管理,租户级 manager 统一返回不可见。`agent_asset_releases.py` 与既有风险规则发布入口只从认证上下文传递平台管理员权限,不能由请求体或自报 actor 绕过。
- 修改:`expense_claim_risk_rule_loader.py` 在候选快照与稳定快照均无法通过 SHA-256 完整性校验时生成强制阻断信号,`expense_claim_platform_risk.py` 将该信号转换为 critical/block 风险,而不是把损坏规则当成“未命中”静默跳过。
- 操作:仅通过 `apply_patch` 修改源码和测试;保护现有财务规则 XLSX、历史未跟踪开发目录及其他智能体改动未执行提交、推送或数据库破坏操作。
- 验证:在 `local-x-financial-linux` 容器内运行 Ruff 定向检查通过;`test_agent_asset_release_guard.py``test_agent_asset_release_runtime.py` 共 12 项测试全部通过,新增覆盖租户 manager 无权管理全局发布资产、平台 admin 可管理,以及双快照损坏后报销自动流转被阻断。
- 影响:单租户管理员不再能影响所有企业共享的风险规则;受控发布元数据损坏时系统优先停流并提示平台恢复稳定版本,避免风险规则失效后继续自动审批。
- 19:53继续修复发布质量指标可由管理人员手工伪造的问题。
- Git 提交检查:再次执行 `git fetch --all --prune``HEAD..origin/main` 仍无上游新提交;本地仍 ahead 17提交范围与 19:48 检查一致,未自动合并、变基或覆盖共享工作区改动。
- 修改:新增 `agent_asset_release_monitor_auth.py`,评测请求必须使用至少 32 字节独立密钥对时间戳、租户、资产、release ID、当前阶段和规范化请求体摘要做 HMAC-SHA256 签名;仅允许 5 分钟时钟窗口并使用常量时间比较。`agent_asset_releases.py` 在写入评测记录前验证签名,密钥未配置返回 503缺失、过期或错误签名返回 401。
- 操作:保留服务层直接写入能力供同进程可信监控使用,但关闭普通 HTTP manager 仅凭自报数字写入“通过”证据的路径;签名绑定 release ID 和阶段,旧阶段请求不能在晋级后重复使用。
- 验证:容器内 Ruff 定向检查通过;发布 guard/runtime 共 12 项测试通过HTTP 用例新增未签名评测返回 401同时签名监控数据仍可触发 shadow→Canary→active 和指标越界自动回滚。
- 影响:人工管理权限与机器监控证据分离,发布门禁不再把未经认证的手工数字当成可信质量结果。
- 21:51补齐“签名合法但指标仍可伪造”的第二层真实性修复并接通真实证据自动回滚。
- Git 提交检查:执行 `git fetch --all --prune``git status -sb``git log HEAD..@{u}``git log @{u}..HEAD``origin/main` 无新提交,本地仍 ahead 17最新提交仍为 `242d68c3 feat(approval): add task workflow and waiver decisions`,其余 ahead 提交为既有审批、AI 费用学习、报销预审、迁移安全和会话认证检查点。本次未合并、变基、提交或推送,也未触碰受保护财务规则 XLSX。
- 修改Release Monitor HTTP 契约改为禁止额外字段的空触发请求HMAC 继续绑定 tenant/asset/release/stage`total``precision` 等质量数字只能由服务端查询 append-only observation/label 聚合;即使签名正确,携带伪造汇总字段也返回 422。
- 修改:真实 shadow/Canary/active manifest 执行追加脱敏 observation类型化 `RiskDispositionEvent` 追加可信标签并即时触发 Guard相同 release 聚合快照复用同一测试运行,低 precision 或结构化运行失败自动回滚 stable。即时监控失败由租户周期调度补偿`collecting` 不写虚假 passed。
- 修改:新增 `0018` 两张发布遥测表、复合租户/release 外键、幂等唯一约束和 PostgreSQL append-only 触发器,并登记主 metadata、迁移所有权与启动前置检查将风险处置发布同步拆到独立服务使核心 `risk_dispositions.py` 保持 800 行以内。
- 操作:全部源码与文档通过 `apply_patch` 修改;用独立 `pgvector/pgvector:pg17` 一次性数据库验证完整迁移链及数据库约束,未连接或变更生产数据库。
- 验证:容器内发布 Guard/Runtime/Telemetry/Monitor/风险处置组合 44 项通过调度器、Monitor 与风险处置定向 24 项通过;迁移/schema owner 静态回归 112 项、启动前置检查 77 项、一次性 PostgreSQL 完整迁移循环 1 项通过PostgreSQL savings/commercial/financial connector/approval 并发探针共 14 项通过。Ruff 定向检查与 `git diff --check` 通过(文档回填后仍需最终全量复验)。
- 影响:发布质量门禁不再信任“会签名的调用方”提交的汇总数字,而是由数据库真实执行与可信人工结论生成;遥测暂时失败只会阻止晋级,不会撤销已成功人工处置或关闭现有 stable 保护。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 19:19修复商业计量迁移上线后标准调整 Savings 回填脚本因精确锁定旧版本而错误拒绝执行的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`backfill_standard_adjustment_savings.py` 不再要求当前 revision 必须精确等于 `20260716_0015`,改为遍历 Alembic `down_revision` 祖先链,只有当前迁移确实包含 Savings 数据契约时才允许回填。
- 修改:`test_standard_adjustment_savings_backfill.py` 覆盖所需版本本身、后继商业迁移 `0016`、更旧版本和未迁移数据库四类边界。
- 操作:全部检查均在 `local-x-financial-linux` 容器内执行,未修改财务规则 XLSX 或历史开发文档。
- 验证Ruff 通过;标准调整 Savings 回填定向回归 `12 passed`
- 影响:数据库升级到 `0016` 及未来合法后继版本后仍可安全执行历史节省回填;更旧、未迁移或不包含目标契约的版本仍会 fail-closed。

View File

@@ -0,0 +1,17 @@
## 修复记录
- 19:24修复历史费用偏离分析可能读取分析截止时间之后才冻结的基线、形成时间穿越的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:`savings_insight_analysis.py` 在历史基线查询中增加 `frozen_at <= as_of`,确保候选分析只能使用截止时间当时已经存在的冻结快照。
- 修改:`test_savings_baseline_insights.py` 新增未来冻结基线回归;确认这类快照不会产生历史价格偏离候选,并返回基线不可用的数据质量提示。
- 操作:全部检查均在 `local-x-financial-linux` 容器内执行,未修改财务规则 XLSX 或历史开发文档。
- 验证Savings 基线/洞察、端点与 CFO 组合回归 `10 passed`;相关 Ruff 检查通过。
- 影响:`as_of` 历史回放不再引用未来才生成的知识CFO 候选洞察和审计结果保持时间一致性。
- 22:50继续修复预算预测读取分析窗口或 `as_of` 之后预算配置与核销流水的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地仍相对 upstream ahead 17 个既有提交(`242d68c3``661990b2`,内容为审批任务/风险处置、AI 学习与预审、Expense Case、迁移安全和认证等共享能力未发现新的上游提交也未合并或改写共享工作树。
- 修改:`savings_insight_budget.py``min(as_of, window_end)` 作为预算分析截止点,只读取当时已经创建且最后更新的预算配置,以及预算期间开始至截止点的核销/回滚事实;部门范围优先使用稳定部门 ID缺 ID 才使用部门名称或成本中心。
- 修改:`test_savings_baseline_insights.py` 增加窗口后核销、截止时间后配置、稳定重放与零机会副作用回归。
- 操作:所有 pytest 和 Ruff 均在 `local-x-financial-linux` 容器内以 60 秒超时执行;未接触财务规则 XLSX、商业/连接器/发布迁移或迁移 HEAD。
- 验证Savings/CFO 定向组合 `34 passed, 6 skipped`6 项为未配置 PostgreSQL 专用测试 URL 的预期跳过),相关 Ruff 检查通过。
- 影响:历史预算预测不再使用报告窗口之后才出现的配置或交易,异常归因、政策模拟候选与 CFO 审计回放保持同一时间边界。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 18:11记录 bug 修复:接受住宿职级标准调整时不再信任客户端金额、天数或金额快照。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 未发现 upstream 新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3 feat(approval): add task workflow and waiver decisions``28b834ed fix(approval): replay immutable action responses``4940ebc4 feat(approval): add safe risk disposition workflow``ee88a36b feat(ai): add tenant-safe hierarchical expense learning``6bdf65bc feat(expenses): add authoritative pre-review workflow``ae3f02c3 feat(expense): add persistent zero-entry receipt association``54754b55 feat(ai): add personal expense application memory``211f85d9 feat(ai): unify verified expense application workflow``5b246307 feat(ai): issue verified application preview decisions``a662cfe6 feat(ai): add expense application feedback ledger``5ed34c2b feat(expenses): backfill historical claims into expense cases``11275e4b fix(migrations): enforce schema ownership safety``1347366b feat(expenses): secure timeline and draft events``22669a90 feat(expenses): show unified expense event timeline``a616b30c fix(expenses): unify AI application submission transaction``653eda05 feat(auth): add opaque bearer sessions``661990b2 feat(expenses): add transactional expense case events`;这些提交均早于本次未提交修复,本次没有拉取、合并或覆盖共享工作树。
- 修改:`expense_claim_standard_adjustment.py` 只从已锁定的 `ExpenseClaimItem.item_amount` 读取原始金额,只接受服务端差旅规则计算出的最终可报金额;客户端携带的 `application_days``original_amount``reimbursable_amount` 仅作为旧界面兼容展示字段,不参与计算。服务端快照新增规则名、规则版本(无发布版本时使用内容指纹)、地点、匹配城市、职级、职级档、天数、每日住宿标准、住宿标准总额及计算指纹。
- 修改:为标准调整增加 PostgreSQL advisory lock + Claim/Item 行锁和非 PostgreSQL 进程内串行锁;请求支持 `request_id` 幂等键与 `expected_updated_at` 乐观前置条件。相同请求直接重放且不改 `created_at`/计算快照,同请求号改选其他明细会被拒绝;单次调整只替换被选明细的快照,不再误删其他明细已接受的标准调整。
- 操作:在 `local-x-financial-linux` 容器及 `/tmp/x-financial-server-venv` 中运行定向、接口全量和服务全量测试;运行 scoped Ruff 与 `git diff --check`,未在宿主机运行 Python/pytest也未修改规则表或其他用户文件。
- 验证:标准调整定向回归(含非 PostgreSQL 同租户同单据锁竞争)`9 passed``test_reimbursement_endpoints.py` 全量 `22 passed`Scoped Ruff 与 `git diff --check` 通过。`test_expense_claim_service.py` 全量为 `112 passed, 8 failed`8 个失败均位于既有审批任务配置/旧错误文案断言(直属领导任务、费用申请提交、本人审批、重复退回),不经过标准调整实现;本次新增及关联标准调整用例全部通过。
- 影响:伪造低原金额、任意可报金额或超长住宿天数不能降低或抬高实际报销额;规则缺失时整次操作失败关闭且不改金额。审批人看到的原额、可报额和差额均可追溯到数据库明细与服务端规则证据,重复点击和并发请求不会重写金额证据。

View File

@@ -0,0 +1,9 @@
## 修复记录
- 19:37修复 Workbench AI 超大运行时导致职责耦合,以及前端回归测试仍绑定旧单体文件和宿主机缺失 Pillow 的问题。
- Git 提交检查:已执行 `git fetch --all --prune``HEAD..origin/main` 无新提交;本地相对 upstream ahead 17 个既有提交,依次为 `242d68c3``28b834ed``4940ebc4``ee88a36b``6bdf65bc``ae3f02c3``54754b55``211f85d9``5b246307``a662cfe6``5ed34c2b``11275e4b``1347366b``22669a90``a616b30c``653eda05``661990b2`;本次未合并、覆盖或改写共享工作树中的其他变更。
- 修改:将会话滚动、流式响应、持久化/重置提取到 `useWorkbenchAiConversationRuntime.js`,把模型意图规划、低置信确认和多任务衔接提取到 `useWorkbenchAiIntentExecution.js``usePersonalWorkbenchAiMode.js` 降至 768 行。
- 修改Workbench、会话删除、报销关联与快速申请预览测试改为联合审计入口与职责模块视觉验证复用容器已有 ImageMagick保留像素和动画断言不再依赖未安装的 Pillow。
- 操作:全部 node 测试和构建均在 `local-x-financial-linux` 容器内执行,未修改后端或财务规则 XLSX。
- 验证Workbench AI/会话组合 `85 passed`,快速申请预览 `67 passed`Vite 生产构建成功2229 modules`git diff --check` 通过。
- 影响:会话清理、详情智能录入、关联门禁和申请预览的回归测试不再因内部职责迁移误报,核心运行时恢复到项目 800 行硬上限内。