Files
th-hotel-simple/docs/project/requirements/M012-fixed-channel-parsing-agent-v1-runtime-integration-change-request-v1.md
T
鲨鱼辣椒 694c4317a3 checkpoint: complete recoverable V2 pre-separation baseline
Complete the selective V2 checkpoint with its minimal AgentBus, object-storage, replay persistence, and validated-workbench shared dependency closure.
2026-08-20 17:09:00 +08:00

664 lines
42 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M012 / Fixed-Channel Parsing Agent v1 Runtime Integration Change Request v1
| 项 | 内容 |
|---|---|
| 状态 | **CP5 TEST SUPERAGENT BINDING + LIVE CONTRACT SMOKE COMPLETE — automatic worker / production HOLD** |
| 日期 | 2026-08-14 |
| 最近修订 | 2026-08-17(公开Trace传递与安全投影本地完成;未复跑真实Provider) |
| 目标 | 信息系统消费公共 Parser 输出,调用 Parsing Agent v1.0,并在本地确定性合并 |
| 渠道 | QBD、LIANTAI;不含 LIANTAI_FIT |
| Checkpoint | `M012-fixed-channel-parsing-agent-v1-runtime-integration` |
| 影响范围 | Backend / Layer 3 contracts / SourceMessage / Booking worker / SuperAgent adapter / Booking PostgreSQL / Test / Docs |
| 发布边界 | 测试平台 Profile/Skill/外部应用已绑定并完成受控真实 Provider 冒烟;自动 worker、production、PMS/Opera 仍关闭 |
## 1. 背景与当前运行事实
固定渠道公共 Parser 已按 ADR-008 完成,QBD/LianTai 默认 `parse()` 均返回
`ParserResult(meta,status,facts[],agent_materials[])`。真实样本批准基线为:
- QBD:114 facts / 4 WAITING materials;
- LianTai:70 facts / 6 materials;
- 扩大 Parser 专项及真实样本:0 failures/errors。
Parsing Agent v1.0 已按 ADR-009 完成 Skill/schema/reference/fixture/validator/package 和独立中文 Main
Prompt,输出为中立 `structured_mentions[]`,不再输出 Trace、部门或最终业务分类。当前 Agent 专项 22/22、
Python 全套 50/50、15成员 source/archive/manifest 严格校验均通过。2026-08-14 已将对应 Prompt 与 Skill
绑定到测试 SuperAgent Profile,并完成真实契约冒烟;源发布包仍保持 `HOLD/INTERNAL_ONLY`,不代表生产发布。
CP4 已在默认关闭的 v1 分支中接通上述公共契约;默认开关仍保留 legacy 链:
```text
Current message + current attachment bytes
→ BookingPostgresMessageOrchestrator
→ BookingContractAssembler.parseLegacy()
→ optional old Field Recovery(默认/生产关闭)
→ legacy ParsedFactSet
→ Context / Layer 5
```
v1 分支现已具备 request/evidence builder、provider-neutral port、SuperAgent adapter、response validator、
local merger、Layer 3 effective result、pre-Context durable execution/worker、双入口 SourceMessage、Parser FAILED
受控fallback,以及latest Layer3ResultV2 direct handoff/同run current Layer4/5/6 continuation。旧compatibility
projection只保留为CP6前legacy资产。测试平台绑定和真实 adapter 契约冒烟已完成;尚未做的是部署环境 Secret
注入、自动 worker 启用、完整 AgentBus→PostgreSQL 主链 smoke、业务 required-fact catalog、MySQL V30/运行保障
Gate和CP6 legacy退出。获批非生产 PostgreSQL V1–V6 migration/restart/lease/concurrency smoke 已于2026-08-12
通过;运行保障Gate尚缺告警/人工恢复运行手册。
## 2. 权威基线
实施必须同时遵守:
1. ADR-008 与 `M012-qbd-liantai-parser-output-contract-v1.md`;
2. ADR-009 与 `M012-fixed-channel-parsing-agent-v1-contract.md`;
3. ADR-005 的 per-agent external app/token;
4. SourceMessage 先落库、AgentBus callback 不等待外部 Agent;
5. Layer 3 中立结构、Layer 4 Context/RateRoom、Layer 5 业务判断、Layer 6 Validator 的既有边界。
如旧 Recovery、C03-v2、`Layer3ContractsV2`、旧 contribution service 或历史 CR 与上述基线冲突,
只能作为迁移证据,不得扩展成新 v1 行为。
## 3. 目标与非目标
### 3.1 目标
1. 两个入口都以持久 SourceMessage 作为 Current/History 唯一来源。
2. 主链调用公共 `parse()` 并保存 ParserResult,不在 v1 分支调用 `parseLegacy()`。
3. 信息系统确定性组装完整 v1 request 和 evidence registry。
4. 通过 provider-neutral Port 调用 Parsing Agent,使用 fake/mock 完成常规验收。
5. 信息系统严格校验 Agent 返回,并在本地确定性合并。
6. 输出权威 `effective_facts[]`、中立 `structured_mentions[]` 和 `review_items[]`,并承接其余合法中立结构。
7. 持久化执行状态、幂等、重试、审计与 failure codes,进程重启后可恢复。
8. 将最终八数组Layer3无业务解释地投影latest Layer3ResultV2,并以同run续接当前Layer4/5/6;V2无槽位审计放sidecar。
9. 以独立checkpoint退役compatibility/legacy,不在本次删除历史资产。
### 3.2 非目标
- 不修改已验收的 Parser 十类事实、QBD/LianTai Profile 规则或真实样本口径。
- 不让 Agent 覆盖 Parser facts、创建 TaskCard、写数据库业务状态或调用 PMS/Opera。
- 不让 Layer 3 决定 business type、Trace、linked action、部门、Rate Code 或 canonical Room。
- 不把 Main Prompt 放进 Skill 包,也不在本 CR 中修改 Prompt 内容。
- 不新增 Controller、MCP、浏览器或第三方入站接口。
- 不在首个 runtime checkpoint 删除所有旧 Recovery/legacy 资产。
- 不在代码合并时自动启用 production 或真实 Provider。
## 4. 目标数据流
```text
Manual EML / AgentBus
→ capture or bind Current SourceMessage
→ resolve QBD/LIANTAI Profile
→ run public deterministic Parser on current attachment
→ persist immutable ParserResult + controlled fallback snapshot
→ create/reuse durable Parsing Agent execution
→ worker reloads Current revision + ordered History revisions
→ build history_bodies[] + evidence registry + request
→ request preflight validation
→ FixedChannelParsingAgentPort
→ strict result decoding + semantic validation
→ deterministic local merger + completeness review
→ persist authoritative FixedChannelLayer3Result
→ latest Layer3ResultV2 neutral projection + controlled audit sidecar
→ same-run current Layer 4 / Layer 5 / Layer 6
```
入口在 execution 入队后结束;Provider 等待只能发生在 worker。Worker 不依赖入口内存里的附件 bytes,
因为公共 ParserResult 和 fallback snapshot 已持久化。
## 5. 输入快照与调用规则
### 5.1 Current
- 读取确切 `source_message_id + revision` 的完整 subject/body。
- Current attachment 只在同步 Parser 阶段使用;Agent 只接收 ParserResult 和登记后的文本 evidence。
- 当前正文不得由旧 `BookingAgentInputMaterialPolicy` 裁剪或截断。
### 5.2 History
- 由内部 SourceMessage repository/query 按 conversation identity 和稳定 sequence 读取。
- 正文完整传递、不截断;每项固定 source id、revision、sequence、content hash。
- 不传 History 附件、附件文件名、附件 URL、附件 evidence 或附件 bytes。
- 后台 builder 不调用会产生“员工读取原文”审计副作用的 UI original-read service。
### 5.3 Parser Results
- v1 分支只消费公共 `FixedChannelParserContracts.ParserResult`。
- 当前首版维持一个消息中恰好一个匹配固定渠道 workbook 的既有不变量,是否扩展需审批。
- Parser `FAILED` 必须 `facts=[]` 且 `agent_materials=[]`;只能由外层受控 fallback/review 处理。
- material 的 `target_ref` 按 Parser 契约可为 `null`,不得为满足 Agent schema 伪造 target。
### 5.4 调用矩阵(已实现)
建议每个通过入口、酒店、SourceMessage 和版本校验的 Current message 至多创建一个逻辑 request:
| Current/Parser 条件 | 建议行为 | 状态 |
|---|---|---|
| Parser SUCCESS,有 facts/materials | 同一逻辑execution调用一次;fallback为空 | Implemented |
| Parser SUCCESS,只有 facts | 仍调用,以解析完整 Current/History | Implemented |
| Parser SUCCESS,只有 materials | 调用一次 | Implemented |
| Parser SUCCESS,facts/materials 均空 | body-only同样调用一次;不以正文关键词决定渠道/跳过 | Implemented |
| Parser FAILED,有系统授权 Current-only fallback | 同一逻辑execution调用;只使用持久化有界fallback | Implemented |
| Parser FAILED,无 fallback | 仍处理完整邮件主题/正文;附件生成稳定blocker | Implemented |
| 渠道/Profile/版本未验证 | 不外呼;入口或 request preflight 失败 | Implemented |
无论采用哪一矩阵,都必须以稳定 call/no-call reason code 和唯一 request hash 审计。
## 6. Evidence Registry 提案
### 6.1 Evidence 类型
- Current subject;
- Current body;
- ordered History body;
- Parser facts/materials 的准确来源引用;
- 信息系统显式授权的 Current-only fallback。
History attachment 永远不属于 registry。
### 6.2 稳定身份
建议 ID 输入至少包含:
```text
evidence_schema_version
source_message_id
source_revision
scope/current_or_history
section/subject_or_body_or_parser_or_fallback
unicode_code_point_start
unicode_code_point_end
sha256(exact_source_text)
```
相同快照重复组装必须得到相同 ID。span 以 Unicode code point 计数,不使用 UTF-16 code unit;
`source_text` 必须是保存 revision 的准确子串,不做 trim、翻译或换行归一化后再定位。
### 6.3 分段建议(待审批)
为兼顾准确引用和可复核性,建议登记:
1. 完整 subject/body block;
2. 非空行 block;
3. 按受控标点形成的 clause block;
4. Parser material 与 fallback 的精确 block;
5. 对相同 source/revision/span/hash 去重。
分段只建立文本索引,不预判语义。若完整 request 超过 Provider 明确上限,preflight 失败;禁止删除 History、
缩短正文或通过摘要替代原文。
## 7. Request Builder 与 Preflight Validator
Request Builder 只接收已验证的内部 snapshot,不直接下载附件或查询 Provider。输出必须精确匹配
`fixed-channel-parsing-agent-input-v1.0.schema.json` 及配套 semantic rules。
Preflight 至少验证:
- channel/profile 精确配对和所有 contract/schema/profile/rule versions;
- Current/History source identity、revision、sequence、hash;
- ParserResult identity、status、facts/materials 和 attachment hash;
- evidence spans、exact text 与 ID 稳定性;
- fallback 只来自 Current 且在系统允许范围;
- target/fact/material/evidence 引用闭合;
- unknown fields、重复 IDs、超限和禁止数据;
- material optional target 的版本兼容策略。
Preflight 失败不得调用 Provider。
## 8. Provider-neutral Port 与 SuperAgent Adapter
建议 workflow Port:
```text
FixedChannelParsingAgentPort
invoke(ValidatedParsingAgentRequest, InvocationContext)
-> ParsingAgentInvocationResult
```
Port 不暴露 SuperAgent session/SSE DTO、token 或 HTTP exception。`InvocationContext` 仅包含稳定幂等键、
deadline、获准版本和安全审计关联。
SuperAgent adapter:
- 使用 `booking.parsing-agent.open-api.*` 独立配置;
- 复用 `SuperAgentOpenApiClientFactory` 和通用 session/SSE/run-status/recovery transport;
- 使用专属 external app/token,不回退到旧 Recovery/Booking Business/global key;
- 将 request 序列化为单一 canonical JSON payload;
- 限制响应大小与 deadline,只接受完整 final/end + successful run;
- 返回 resolved Profile ID供本地强校验,并把actual published version写入运行审计;
- 不把 raw provider answer 写入普通日志或业务 artifact。
常规 CI 只用 fake/mock adapter;真实连接属于单独 release gate。
## 9. Response Validator
Server 不把 Python validator 作为运行时依赖。建议采用严格 Java DTO(unknown property fail)加显式语义
validator,并用同一 canonical fixture 与 Python offline oracle 做 parity。
### 2026-08-17 ADR-018 修订
严格 DTO decode 继续作为整份结构门槛;跨请求语义 Validator 改为逐项验收。整份返回只在
request/message/version/Parser refs/fallback refs 身份不一致时拒绝。身份正确后,只按项目检查引用身份、来源
和 Parser 权威;失败项目及其依赖项目被移除,其他结果继续进入 Merger。以下早期“任一失败拒绝整份”和
“每个 material 必须由 response Validator 恰好闭合”的口径不再适用。
当前必须验证:
1. 顶层八组数组存在且无额外字段;
2. 所有 result IDs 全局唯一;
3. target、fact、material、evidence 引用均存在且类型正确;
4. `source_text/source_label` 可由 evidence registry 还原;单片段精确匹配或多片段共同覆盖Current原文均可,
`sequence`只承担展示顺序;
5. History 不能单独支持本次 candidate fact/relationship/mention/display;
6. candidate fact 不覆盖 Parser 异值;有明确 conflict review 时只保留为复核材料,Merger仍保留Parser值;
7. structured mention scope/target/quantity/source-room/evidence 合法;
8. forbidden business/Trace/department/TaskCard/RateRoom/PMS 字段在任何层级都不存在;
9. 已返回的 material disposition 引用身份与来源合法;缺少某项 disposition 不升级为整份失败;
10. Agent 声明的 conflict/review 与 Parser facts/materials 一致;未知引用只拒绝受影响项目。
candidate 业务值类型与完整性不再由本层作为整份门槛,继续由 Layer 5/6按已识别业务处理。严格 DTO 自身
结构失败仍整份拒绝;逐项恢复不覆盖无法反序列化的 Provider JSON。
## 10. Deterministic Local Merger
Merger 输入仅为 immutable ParserResult、validated Agent result 和冻结的 completeness policy。
规则:
- Parser facts 原样进入 `effective_facts[]`,保留来源与 rule ref;
- Agent candidate 与同 fact key Parser fact 同值时按批准规则合并 provenance,不替换 Parser 值;
- 异值只保留 Parser fact并生成 conflict review;
- 没有 Parser fact时,只有 Current/Parser material/fallback evidence 合法且 target 唯一的候选可成为有效事实;
- History-only、非法 target、非法 role 或引用不足的候选不得进入 effective view;
- 已通过验收的 material disposition保持审计引用;缺少处置不再由本层把整份Agent结果判失败;
- required fact 完全缺失时由 merger/completeness policy 生成 review;
- 合法 `structured_mentions[]`、display、binding、relationship 保持中立,不转成 Trace、部门或业务类型;
- 标准化排序、ID 和 review code 必须在重放中稳定。
### 10.1 最终结果拓扑(已实现)
权威八数组结果经本地merge后,确定性投影为latest Layer3ResultV2;以下中立内容均保留:
```json
{
"effective_facts": [],
"structured_mentions": [],
"display_information": [],
"target_bindings": [],
"relationships": [],
"review_items": []
}
```
V2没有直接业务槽位的Agent target、fact authority、exact v1 target/material/review引用保存在
`FIXED_CHANNEL_LAYER3_V2_AUDIT` sidecar。不得把 mention 塞入十类 Parser fact,也不得丢弃合法
display/binding/relationship;不得在投影器生成business type、Trace、部门、TaskCard、Room或Rate。
## 11. Orchestration 与持久化
### 11.1 入口
- AgentBus:维持先 capture SourceMessage,再触发 Booking;Parser 后只 enqueue execution。
- 手工 EML:PostgreSQL 分支补齐 capture/bind Current SourceMessage,再进入同一 Parser/execution 路径。
- 两条入口不得因来源不同生成不同 request/evidence/merge 规则。
### 11.2 Execution/outbox
实施时以 `server/src/main/resources/db/booking-postgresql/migration/` 的下一可用 Flyway 版本新增表,不能在
本 CR 预占固定编号。建议字段:
- execution id、hotel id、processing run id;
- source message id/revision、parser result artifact key;
- request hash、idempotency key、contract/profile versions;
- status、attempt、next attempt;
- lease owner/token、locked until、fencing version;
- provider session/run/resolved profile/version;
- response hash、safe failure code;
- created/updated/started/completed UTC timestamps。
领取、续租、完成、失败与重试使用 CAS/fencing 或等价单所有者语义。重复 SourceMessage/callback/replay
只能复用同一逻辑 execution,不产生双权威 artifact。
### 11.3 Artifact 与审计
- SourceMessage original store 继续唯一保存完整邮件正文和附件。
- Booking artifact 保存 public ParserResult、controlled fallback snapshot、normalized validated Agent result、
authoritative Layer 3 result。
- invocation audit 保存 refs/hashes/versions/status/failure code/provider metadata;不默认复制完整 request body
或 raw answer。
- 所有记录绑定 hotel + processing run + SourceMessage,沿用 processing-run retention 和访问边界。
## 12. Failure Policy 提案(待审批)
| Failure | 建议系统行为 | Parser facts | 自动业务处理 |
|---|---|---|---|
| Request internal invariant 失败 | run FAILED,记录安全 system code | 保留 artifact | 禁止 |
| Payload 超 Provider 限额 | 不调用;生成 blocker review/受控失败 | 保留 | 禁止 |
| Provider timeout/unavailable | 按稳定幂等键重试;耗尽后 blocker review | 保留 | 禁止 clean task |
| Invalid JSON/schema/forbidden field | 拒绝整份 result;blocker review | 保留 | 禁止 |
| Resolved profile/version mismatch | 契约失败,不 merge | 保留 | 禁止 |
| Parser FAILED,无 fallback | system failure/blocker review | 无 partial | 禁止 |
| Agent candidate 与 Parser 冲突 | Parser 值保留;生成 conflict review | 不变 | 仅人工风险路径 |
| material 未闭合/required fact 缺失 | 生成稳定 review item | 已确认 facts 保留 | 由 Layer 6 fail closed |
是否同时把 provider/contract failure 标记为 processing-run `FAILED`,或保留 run 并以 `BLOCKER review` 继续到
人工页面,需要在 CP0 确认。
## 13. Legacy 迁移与回滚
### 13.1 切换原则
- 新 v1 feature 默认 false,production 显式 false。
- v1 false:维持 `parseLegacy()` 与当前旧链。
- v1 true:使用公共 `parse()` + v1 execution/Agent/merger;旧 Field Recovery 强制 false。
- 不提供 legacy/v1 双写模式,不进行双外部 Agent 调用。
- 新固定渠道 Layer 3 result 直接投影latest `Layer3ResultV2`并进入同run当前Layer4/5/6。compatibility
projector只保留feature关闭/CP6前legacy代码,不再作为新路径权威下游。
### 13.2 回滚
关闭 v1 feature 即恢复 legacy 分支;不删除 execution、artifacts、audit 或历史 migration。未完成 execution
进入获准的 held/cancelled 状态,不能在关闭后继续外呼。具体状态名在 failure policy 审批后冻结。
### 13.3 独立退役
运行观察和 rollback 演练通过后,另开 checkpoint:先移除 runtime 调用,再逐步删除 `parseLegacy()`、
旧 Field Recovery、`Layer3ContractsV2`、`FixedChannelParsingAgentContributionService` 及专属测试。历史 migration
和审计数据永不因代码清理删除。
## 14. 安全与数据边界
- INTERNAL_ONLY,不新增外部入口或权限面。
- 所有查询、artifact、execution 和审计都绑定 hotel 与 processing run。
- Secret 只由部署 Secret 注入;仓库、测试、日志、异常、文档中无真实 key。
- 不外发 History attachments、附件 URL、数据库标识、PMS/Opera 数据或用户未授权上下文。
- 不保存隐藏推理;raw provider answer 默认不持久化。
- 日志使用稳定 ID/hash/failure code,不输出完整正文或 material raw content。
- Provider output 不能直接写 TaskCard、订单、PMS/Opera 或最终业务状态。
## 15. 实施 Checkpoints
1. **CP0 Contract Gate**:技术架构、版本策略和失败矩阵已批准;business completeness catalog 与 release evidence 仍为放行Gate。
2. **CP1 Local Core**:v1 DTO、History/evidence/request builder、validators、merger、fake Port 与 parity tests。
3. **CP2 Durable Execution**:Booking PostgreSQL execution/outbox、claim/fencing/retry/audit 与 fake worker。
4. **CP3 SuperAgent Adapter**:专属 config/wrapper/adapter,仅用 mocked transport 验收。
5. **CP4 Runtime Wiring**:双入口 SourceMessage、公共 ParserResult、FAILED fallback、worker、merge、direct V2 projection和same-run continuation。
6. **CP5 Controlled Release**:平台 Prompt/Skill/Profile/app 绑定证据和无 PII smoke;production 另行批准。
7. **CP6 Legacy Exit**:观察期后独立删除旧 runtime 调用与契约。
每个 checkpoint 独立完成 focused tests、全量相关回归、security review 与 project-doc post-task gate。
## 16. 测试与验收
最低新增测试:
- Java DTO/schema canonical round-trip 和 unknown-field negatives;
- Python/Java fixture parity;
- 完整 History、无 History attachment、Unicode spans、稳定 IDs、超限不截断;
- request identity/version/fallback/ref preflight;
- response forbidden keys、exact source、History-only、Parser conflict、material closure;
- merger immutability、same/different value、deterministic replay、completeness、neutral structures;
- fake Port 与 mocked SuperAgent success/failure/recovery/profile mismatch;
- durable enqueue/claim/fencing/retry/restart/duplicate callback;
- Manual EML 与 AgentBus 同契约集成;
- legacy/v1 互斥与 rollback;
- Secret/PII/raw answer/attachment 不落日志和审计。
回归基线不得下降:QBD 114/4、LianTai 70/6、Parser 扩大样本 0 failures/errors、Agent 22/22、Python
50/50,以及后端 focused/full suite。
## 17. 预计文件归属
| 范围 | 预计归属 |
|---|---|
| v1 runtime DTO | `workflows/reservation/common/dto/booking/layer3/v1` |
| Builder/Validator/Merger | `workflows/reservation/booking/service` 与 `service.impl` |
| Provider-neutral Port | `workflows/reservation/booking/service` |
| SourceMessage History query | `platform/message` 内部 repository/service |
| Execution persistence | `workflows/reservation/booking/repository` + Booking PostgreSQL migration |
| SuperAgent adapter | `integrations/ai/superagent/adapter` + 专属 properties/wrapper |
| Orchestration anchors | `ReservationBookingEmailIntakeServiceImpl`、`AgentBusFrameProcessor`、`BookingContractAssembler`、`BookingPostgresMessageOrchestrator` |
| Config | `application*.yml` 的 `booking.parsing-agent.*`;默认/production false |
| Tests | 对应 server unit/integration、canonical fixtures 与 Python package regression |
共享热点文件只有在对应 checkpoint 开始前重新检查 ownership/diff 后才修改。
## 18. CP0 Approval Checklist
- [x] 接受带审计闭环的八数组 `FixedChannelLayer3Result` topology。
- [x] optional material `target_ref` 采用“字段必有、值可空”的v1.0 pre-release schema纠正。
- [x] 冻结 exact Agent call/no-call matrix。
- [x] 冻结完整文本+行/句片段+附件材料的 evidence segmentation 与超限不截断行为。
- [x] 冻结 History conversation/revision/order sidecar 规则。
- [x] 冻结 failure → Parser-only blocker review / internal execution failed 映射。
- [ ] QBD/LianTai required-fact completeness catalog;通过本地policy注入,未配置时阻塞自动业务放行。
- [x] 首版维持0个body-only或恰好1个匹配workbook,多匹配fail closed。
- [ ] CP5 前提供专属 Main Prompt/Skill/Profile/app/token 绑定证据。
上述技术项已经用户授权由Codex决定,CP1–CP4可以在默认关闭、fake/mock、无真实客资的条件下推进。
required-fact业务目录与CP5平台证据未关闭前,不得启用真实Provider或自动业务放行。
## 19. 当前隔离实现状态(2026-08-12)
已完成一个不依赖上述 open gates、且完全未接线的结果接收切片:
- `FixedChannelParsingAgentResultContracts` 镜像冻结 v1 result envelope,并实施纯结果内部不变量;
- `FixedChannelParsingAgentResultDecoder` 使用严格 Jackson 反序列化,拒绝未知字段、尾随内容、重复 JSON key、
缺失必填字段及非法版本/引用形状;
- canonical QBD/LianTai expected result 可严格 round-trip,负向测试覆盖禁止业务字段、重复 output/material
disposition、scope/target、fallback ref 与 incomplete mention/review 闭环。
该切片没有 Spring 注册、workflow Port、Provider Adapter、request/evidence builder、跨输入 response validator、
Merger、配置、DDL 或编排接线,因此不改变现有 `parseLegacy`/旧 Recovery 运行行为,也不解除
`HOLD/INTERNAL_ONLY`。验证结果为专项 Java 10/10、相关 Java focused 34/34、Agent 21/21、Python 49/49。
后端全量 `mvn test` 共运行 693 tests,0 failures、6 errors、8 skipped;6 个 error 全部来自旧 v0.2
测试引用已删除的 Trace/schema/fixtures,作为兼容迁移项保留,未恢复过时资产。
## 20. CP0技术授权与nullable material target纠正(2026-08-12)
用户已明确委托Codex决定并推进技术方案;ADR-010技术Gate因此关闭,离线CP1–CP4获准在默认关闭、
fake/mock、无真实客资条件下实施。business required-fact catalog和CP5平台绑定仍是自动业务/真实Provider
放行Gate。
Parser material `target_ref`按已冻结业务/Java契约纠正为required-but-nullable;Parser fact target继续必须为
对象。该修正属于从未发布且持续HOLD的v1.0 schema表达纠错,不创建v1.1双轨,不修改Main Prompt。
Agent专项22/22、Python全套50/50通过;15成员包确定性重建和`--check`通过,当前SHA-256为
`3ee9bbb90107078710958df15901c87cbea7be219ab6cb29540ab348e3f02ff2`。本次hash更新来自canonical
evidence span发布前纠正;Main Prompt SHA、成员数量和HOLD状态不变。
## 21. CP1纯本地核心完成状态(2026-08-12)
默认关闭、无Spring/Provider/数据库接线的CP1核心已完成:
- v1 request/result/final Layer3强类型DTO与严格result decoder;
- 完整Current/History、Unicode code-point、稳定ID/hash的evidence registry和request builder;
- Provider调用前request preflight与返回后的跨输入semantic validator;
- 八数组`FixedChannelLayer3Result`、Parser不可覆盖的deterministic merger和Parser-only failure结果;
- required-fact policy端口;未配置时明确BLOCKER,禁止猜测酒店业务目录;
- provider-neutral Port、test-only fake和无运行态接线的local pipeline。
Java联合focused 59/59、Agent专项22/22、Python全套50/50通过。Profile平台ID/version白名单、持久execution、
真实SuperAgent adapter、主链接线与legacy迁移仍分别属于CP2–CP5;当前没有真实外部调用,发布继续
`HOLD/INTERNAL_ONLY`。
## 22. CP2持久Execution与Worker完成状态(2026-08-12)
默认不注册worker、不调用真实Provider的CP2离线核心已完成:
- Booking PostgreSQL V5定义durable execution、四类normalized artifact、lease、fencing、retry与终态约束;
- repository实施精确run/source/revision入队、幂等冲突核对、`SKIP LOCKED`领取、过期接管、续租和CAS;
- artifact必须为JSON object且hash匹配,同type只能幂等重放,不得用新payload覆盖旧快照;
- 终态前必须已有Parser和同hash Layer3 artifact;`SUCCEEDED`额外要求validated Agent artifact;
- 无Spring接线durable worker支持heartbeat、指数backoff、重试耗尽Parser-only review与崩溃后更高fence恢复;
- local handler从内部loader重建v1 request,重新核对identity/hash/bytes/History revisions/version,只保存
Parser/fallback、validated Agent result和authoritative Layer3,不保存raw answer。
timeout/unavailable进入持久重试;invalid JSON/schema/profile等可预期契约失败直接形成Parser-only
blocker;内部request/persistence invariant不发布权威Layer3。CP1+CP2 Java联合focused 83/83、Agent
22/22、Python 50/50通过。本checkpoint未连接真实PostgreSQL,未注册scheduler/SourceMessage
loader,未调用SuperAgent/AgentBus/PMS/Opera;runtime继续`HOLD/INTERNAL_ONLY`。
## 23. CP3专属SuperAgent Adapter完成状态(2026-08-12)
默认/production关闭、仅mocked transport验收的CP3已完成:
- 新增`booking.parsing-agent.*`专属properties、独立API key与expected Profile ID栅栏;不回退旧
Recovery、Booking Business、Debug EML、AgentBus或global key;
- 专属wrapper只复用`SuperAgentOpenApiClientFactory`及既有session/SSE/run-status/recovery transport;
- provider-neutral adapter发送完整AgentRequest JSON,使用hash subject与稳定request/idempotency identity,
有界限制request/message/response UTF-8 bytes并在独立executor中执行整体deadline;
- Trace被配置门禁强制关闭;实际resolved Profile ID必须与部署值精确一致,published version只作运行审计;
- payload oversize、invalid response和profile mismatch立即形成Parser-only终态review;timeout/unavailable由CP2
durable worker重试;executor拒绝fail fast,不回退入口/worker线程执行;
- Provider已返回但被本地栅栏拒绝时,只把response hash及安全session/run/Profile/model/token metadata交给
execution审计,不保存raw answer或完整request。
CP1–CP3与共享SuperAgent transport联合focused 119/119、Agent 22/22、Python 50/50通过。该历史checkpoint未
调用真实SuperAgent/AgentBus/PostgreSQL/PMS/Opera,未填写真实Profile/token,未注册scheduler、
SourceMessage loader、pipeline/worker bean或主链;`booking.parsing-agent.enabled`默认false且production
显式false。后续 CP4 已完成运行接线;business required-fact catalog和CP5平台绑定证据仍未完成,runtime继续
`HOLD/INTERNAL_ONLY`。
## 24. CP4内部运行链接线与验收状态(2026-08-12 历史checkpoint;下游边界已由第26节取代)
CP4 已完成并在 fake/mock、无真实外部调用边界内验收:
- 手工 EML 与 AgentBus 都先持久化/复用 SourceMessage,再以 `source-message-inbox:<id>` 进入 Booking;
同一 SourceMessage 的重复 frame 使用相同 Booking 幂等键,changed duplicate 保留首份来源事实且不重放下游;
- v1 固定渠道分支对恰好一个完整 Current workbook 调公共 `parse()`;body-only 建零 ParserResult request;
不完整或多 workbook 调用前失败。该分支不调用 `parseLegacy()`、旧 Recovery 或 `Layer3ContractsV2`;
- Source snapshot loader 读取 exact Current subject/body 与完整有序 History body,History 附件、URL、bytes 均不
进入 request/evidence;revision、Unicode span、hash 与机器读取审计闭合;
- public Parser artifact、execution enqueue 和 run Parser 状态同一 Booking PostgreSQL 事务;worker 的 normalized
artifacts、execution completion、权威 Layer3、compatibility projection 与 Context 同一事务。内部失败同事务
标记 execution/run failed,不发布半成品;
- 权威 `FIXED_CHANNEL_LAYER3_RESULT` 持久保留八数组,包括 `effective_facts[]`、中立
`structured_mentions[]` 和 `review_items[]`;`EFFECTIVE_PARSED_FACT_SET` 仅供现有 Context 兼容。BEFORE 和
中立结构只形成版本化 neutral hint,不能变成 Trace、部门、Rate Code、TaskCard 或 PMS 决定;
- Booking PostgreSQL V6 扩展 runtime artifact allowlist;MySQL V30 保存 exact original subject。既有 V5 migration
未改写。v1/旧 Field Recovery 启动互斥;默认与 production 的 enabled/provider/worker 均为 false;
- 该历史CP4 checkpoint当时不调用 Layer 5 Business Agent:required-fact policy 未配置、有 review 或需要 Agent
的路径都停在 Context。第26节的direct V2 handoff已以同run continuation取代该下游边界。
验证:CP4 定向 Java 233 tests,0 failures/errors、7 skipped;排除两组明确属于 CP6 的旧 v0.2 测试后,
其余主流程 Java 782 tests,0 failures/errors、8 skipped。原始全量 789 tests 仍有 6 个 FileNotFound errors,
全部来自 `FixedChannelParsingAgentContributionServiceTest` 与 `FixedChannelParsingAgentV02ContractTest` 读取已删除
v0.2 schema/fixtures,CP4 新 failure 为 0。Agent 22/22、Python 50/50、Skill source/archive/manifest 严格校验通过。
CP4 不等于生产启用:真实 Provider/scheduler 未注册,未调用 AgentBus WebSocket、PMS 或 Opera。CP4 收口后,
用户另行批准的非生产 PostgreSQL Gate 已完成V1–V6 migration、幂等启动、restart/lease/fencing/concurrency
smoke;没有调用Provider,测试数据已清理。CP5 前仍须补齐专属 Main Prompt/Skill/Profile/app/token/API
exposure 绑定证据、无 PII 合成 smoke、MySQL V30真实migration smoke、required-fact 业务目录,以及 v1
terminal failure 的人工重放/告警runbook。CP6 之前不得删除
`parseLegacy()`、旧 Recovery、`Layer3ContractsV2` 或旧 contribution service。
## 25. CP4后PostgreSQL基础设施Gate(2026-08-12)
- 目标测试库经只读门禁确认为PostgreSQL 15.14 writable primary、非superuser角色和预期数据库/schema owner;
- 旧`schema_migration`与仓库V001完全一致,八张旧业务表均为空;Flyway以version 0记录旧模型共存,不删除、
重命名或回填旧对象,随后成功应用V1–V6;
- 两个独立Spring上下文验证进程重启后的过期lease接管:新owner由attempt/fence 1推进到2,旧owner续租和终态
写入均被拒绝;两个独立连接池并发claim同一execution时只有一个成功;
- 真实PgJDBC暴露`Instant`无法直接绑定`TIMESTAMPTZ`的问题,repository统一以`Timestamp`写入,领域契约不变;
- 正式opt-in PostgreSQL smoke 1/1、repository focused 7/7、当前主流程Java(排除两组CP6历史类)789项均
0 failures/errors(9 skipped);合成数据归零、旧业务表仍为空、无跨schema外键;
- 该Gate未授权或启动CP5 Provider/scheduler、CP6删除、MySQL、PMS或Opera。MySQL V30和告警/人工恢复runbook
仍是自动运行发布前置条件,但不阻塞第27节的受控测试平台绑定与合成契约冒烟。
## 26. CP4 V2 direct handoff 与 Parser FAILED fallback(2026-08-13)
在不改变ADR-010核心决策、冻结Agent Schema/Main Prompt/Skill或Parser契约的前提下,CP4主链补齐如下:
- 当前`@Primary BookingMessageOrchestratorV2Impl`对已验证QBD/LianTai执行公共Parser,持久化ParserResult与
fallback snapshot,原子enqueue并把同一run标记`AWAITING_PARSING_AGENT`;入口随即返回,不执行Layer4–7;
- worker本地严格校验/merge后,以`FixedChannelLayer3V2Projector`直接生成latest `Layer3ResultV2`;targets、
bindings、relationships、neutral mentions、display、reviews、evidence、material dispositions完整保留,V2无槽位
的authority和exact v1审计保存`FIXED_CHANNEL_LAYER3_V2_AUDIT`;
- `BookingV2Layer3Continuation`以相同run执行当前Layer4/5/6并保存现有Layer7 confirmation projection边界;
callback/终态重放不重复Parsing Agent或Layer5,不创建第二run;
- expected Agent失败生成Parser-only blocker后仍同run fail closed;内部identity/persistence/downstream invariant
标记execution/run failed,不发布半成品或继续下游;
- Parser FAILED fallback只授权唯一Current `.xlsx`且严格匹配source/revision/attachment/hash/MIME/size;最多
2 MiB、4 visible sheets、200 visible rows、800 visible scalar cells、512 code points/cell、20,000 total,任一超限
整体拒绝且不截断。公式、宏、链接、图片、注释、隐藏内容、URL-like scalar、损坏workbook、History附件、
bytes/Base64和外部下载全部拒绝;worker只读持久snapshot;
- FAILED无fallback仍接收完整Current主题/正文并生成`PARSER_FAILED_NO_AUTHORIZED_FALLBACK`;SUCCESS fallback、
identity不一致、未知evidence、重复/缺失material disposition、越界cell均fail closed;
- AgentBus收到新固定渠道queued warning时抑制旧realtime dispatch;feature关闭、非固定渠道、未接管路径不变。
- `SOURCE_ROOM_NAME`的raw值与workbook Evidence继续保留;normalized值必须来自Profile Parser已成功解析的
`sourceRoomType`,V2 projector不得重新归一。无法确定标准房型时不发布该fact而进入material/review;Layer4
继续exact-only,不新增fuzzy、contains或空格/连字符等价,也不改Roomtype authority/catalog。
补充E2E覆盖QBD与普通LianTai:`ONE BEDROOM SUITE DBL`与直接`ONE-BEDROOM-SUITE-DBL`均在Layer3/V2保留
标准normalized值并由Layer4解析`RM2`,原文/Evidence可审计,Rate/早餐结果一致;Q10、Garden、Pool及未知label
回归通过(QBD均为`GRPA1/含早/BUALUANG`,普通LianTai均为`LBLT/不含早`)。最终本地fake/mock focused为
149 tests(142 executed、7 real-sample skipped、0 failures/errors)。全量后端902
tests、1 failure、0 errors、9 skipped;唯一failure为范围外并行V4 controller用例
`ReservationV4CommandControllerTest.shouldResolveRoomInformationReviewWhenDisplayPayloadAlreadyUsesStableModel`
(expected 200、actual 400),未在本专项修改。未调用真实Provider、AgentBus WebSocket、真实数据库、PMS或Opera。
默认和production的Parsing Agent/provider/worker仍false;CP5、CP6、frontend与外部写入继续HOLD。
## 27. CP5 测试 SuperAgent 绑定与真实契约冒烟(2026-08-14)
用户明确授权调用测试环境 AgentBus/SuperAgent、禁止调用 PMS/Opera 后,CP5 在“测试平台绑定+受控合成
Provider 调用”边界内完成。AgentBus 是入站消息入口,SuperAgent 是异步 Provider;二者不是同一个调用,
本次没有启动 AgentBus WebSocket 或部署自动 worker。
### 27.1 平台绑定证据
按 ADR-005 使用两个互不共享 Secret 的 external app,公开 Open Agent API 仍由 token 绑定 Profile:
| Agent | Profile ID | 已发布版本 ID | 模型 | 唯一启用 Skill | Main Prompt trimmed SHA-256 |
| --- | --- | --- | --- | --- | --- |
| Booking Business Agent | `85ab8334-4e1c-4716-8ec0-9c3c099cec9b` | `9fed48c0-1f53-4d5a-8ba0-52865c738d83`(v7) | `deepseek-v4-pro` | `booking-desk-event` | `a54a0c12dc2a815af04f970999101f474913c21aafff72c3d1d8d5ead5cdc47f` |
| Fixed-channel Parsing Agent | `ea56cb01-72f0-4ef2-9a73-40cfae1abcd4` | `8b30ebe9-180c-433b-89cf-9c59933b618a`(v8) | `deepseek-v4-pro` | `fixed-channel-core-parsing-agent` | `b59891f4cbd043a35c0ed76ba57d5d733a6d6816e6a2455b899514c568279e2` |
两份平台 Prompt 与仓库独立 Main Prompt 在去除平台归一化的尾部空白后逐字一致;Main Prompt 仍未打入
`.skill` 包。两个 Profile 均通过平台发布检查 11/11,API 与 stream 开启,MCP、memory、Profile calls 和
公开 Trace 均关闭,最大并发为 2。平台 ID 可进入非敏感配置,external app Secret 不写入仓库、文档或日志。
### 27.2 真实 Provider 契约结果
- Booking:Java opt-in smoke通过1/1,耗时52.782秒;真实返回精确命中上述Profile/v7,经过当前
`BookingBusinessAgentInputV1`投影、严格CandidateDecisionV2 decoder和Layer6 validator,
`canonical-new-payment`合成样本包含合法`NEW_BOOKING` target。另一次直接transport smoke以general语义得到
evidence-closed的`GENERAL_NOTIFICATION`。
- Parsing:Java opt-in smoke 通过 1/1,耗时 202.146 秒;真实返回精确命中上述 Profile/v8,使用 LianTai
canonical 合成 fixture,经过当前 adapter、deadline、严格 decoder 与 response validator,完整答案超过
2,000 字符且契约校验通过。
- 真实 Parsing 调用暴露平台公共 `message.final` 约 2,000 字符上限:同一 SSE 中较早、
`finish_reason=stop` 的 assistant message 含完整 JSON,而 `message.final` 是其严格前缀。共享 SSE parser
已收紧为:只有 core final 是当前完整 stop 内容的严格前缀时才保留完整内容;不同内容的显式 core final
仍保持权威。Parsing 默认整体等待上限据实由 120 秒提高为 240 秒。
### 27.3 本地配置、验证与未放行边界
- 默认配置已锁定两个已验证 Profile/version;所有 enabled/provider/worker 开关仍为 `false`,production
继续硬关闭。部署 Secret 未写入任何配置文件。
- SuperAgent transport/config/adapter focused:53 tests,0 failures、0 errors、2 个真实测试默认 skip。
- 后端全量稳定复跑:953 tests,1 failure、0 errors、11 skipped。唯一失败是并行 V4 范围外既有用例
`ReservationV4CommandControllerTest.shouldResolveRoomInformationReviewWhenDisplayPayloadAlreadyUsesStableModel`
(expected 200、actual 400),不经过本次 CP5 代码。
- 本次没有连接 AgentBus WebSocket、没有部署或重启应用 worker、没有执行数据库 migration/lease smoke,
没有调用 PMS/Opera,也没有开始 CP6 删除。
因此,CP5 的测试平台身份、Prompt/Skill/Profile/version 绑定及两条真实 Provider 契约调用已经闭环;要形成
自动运行发布,仍须在指定非生产部署中注入独立 Secret、重启并启用选定 worker,执行完整
AgentBus→SourceMessage→PostgreSQL execution→两 Agent→Layer 6 smoke,补齐监控/告警/人工重放手册和所需
required-fact 业务目录。若部署仍走 MySQL 主路径,还需完成 V30 migration 验证。production、V2→V4
authoritative writer、PMS/Opera 与 CP6 均需单独批准。
## 28. 公开 Trace 主线修订(2026-08-17)
M012 Processing Run全生命周期日志已确认要求当前fixed-channel Parsing Agent调用携带
`include_trace=true`。`booking.parsing-agent.open-api.include-trace`现默认true,显式false由properties校验
在Provider调用前fail closed;第23节“Trace强制关闭”和第27.1节“测试平台公开Trace关闭”仅保留为当时
checkpoint/平台状态,不再表示当前信息系统调用契约。legacy Field Recovery的no-Trace兼容边界不变。
Trace模式只有公开`run.completed(status=success)`和顶层`end`同时存在才成功;core `message.final`只提供
进程内最终JSON,不能替代完成证据。安全`public_trace_events`通过既有adapter进入Parsing execution audit/
回放,可保留`reasoning.summary`等公开摘要;`message.delta`/`message.final`文本不写可持久Trace,URL、Secret、
Authorization、Cookie与CSRF统一脱敏并限长,raw answer与完整request继续不保存。
属性/SSE/安全投影/两条业务主链37项与共享client loopback 4项聚焦测试全部通过。本修订未调用真实SuperAgent、
数据库、AgentBus WebSocket、PMS/Opera,未开启Parsing Agent/provider/worker或production开关;平台能力启用和
目标环境live smoke仍是部署门禁。