consolidate active contracts under v1
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## 1. 状态、权限与使用方式
|
||||
|
||||
**状态:D01–D10原方向已确认,旧W01契约和W02 Proto已有项目内证据;本轮用户确认SaaS↔Dispatcher全MQ,受影响G0的项目内部分已按[计划§1.2/§8.2](plan-0918.md)重新验证。** SaaS与D之间所有请求、响应和事件禁止HTTP,每个D具备全局唯一ID和独立接收Topic/队列;v2/v3 Schema、拓扑和关联已有本地包及RabbitMQ证据,外部发布/签收另计。OSS补充确认:配置存于D配置文件,A向D领取固定15分钟临时上传TOKEN后直传;SaaS不再提供OSS配置/TOKEN,上传完成以recording.uploaded可靠入队为界,不等待SaaS verified或OSS ID,D不转发文件。原HTTP方向被本修订替代,不把旧证据覆盖到新设计。
|
||||
**状态:D01–D10原方向已确认,旧W01契约和W02 Proto已有项目内证据;本轮用户确认SaaS↔Dispatcher全MQ,受影响G0的项目内部分已按[计划§1.2/§8.2](plan-0918.md)重新验证。** SaaS与D之间所有请求、响应和事件禁止HTTP,每个D具备全局唯一ID和独立接收Topic/队列;V1 Schema、拓扑和关联已有本地包及RabbitMQ证据,外部发布/签收另计。OSS补充确认:配置存于D配置文件,A向D领取固定15分钟临时上传TOKEN后直传;SaaS不再提供OSS配置/TOKEN,上传完成以recording.uploaded可靠入队为界,不等待SaaS verified或OSS ID,D不转发文件。原HTTP方向被本修订替代,不把旧证据覆盖到新设计。
|
||||
|
||||
本项目已创建并验证自己的 Go module、W01 bundle、W02 Proto/stubs、RPC/mTLS 和本地 Mock 测试;未修改父项目权威来源、字段索引或生成产物,未访问真实供应商或创建云资源。文件名保留“提案”以保持链接稳定,不代表还需重复审批已确认方向。
|
||||
|
||||
|
||||
+1
-1
@@ -111,7 +111,7 @@ Dispatcher配置包含MQ/SaaS受控引用、SQLite路径、两个Agent Endpoint
|
||||
|
||||
### 3.2 权威来源与独立拆仓
|
||||
|
||||
**本轮用户已确认SaaS↔Dispatcher全MQ:双方不再有任何HTTP请求/回调;每个D有全局唯一ID和独立接收Topic/队列。** 执行、控制、查询、补传、AI配置/授权及上传完成事实均经MQ;上传不申请SaaS会话、不等待verified/OSS ID,详见[SaaS↔D契约](contracts/saas-dispatcher.md)与[计划§1.2/§8.2](plan-0918.md)。旧HTTP和旧租户路由已删除;新Schema/拓扑/身份生命周期/关联已在项目内v2/v3包和本地证据中冻结,旧源包及哈希不改。
|
||||
**本轮用户已确认SaaS↔Dispatcher全MQ:双方不再有任何HTTP请求/回调;每个D有全局唯一ID和独立接收Topic/队列。** 执行、控制、查询、补传、AI配置/授权及上传完成事实均经MQ;上传不申请SaaS会话、不等待verified/OSS ID,详见[SaaS↔D契约](contracts/saas-dispatcher.md)与[计划§1.2/§8.2](plan-0918.md)。旧HTTP和旧租户路由已删除;新Schema/拓扑/身份生命周期/关联已在项目内唯一 V1 包和本地证据中冻结,旧源包及哈希不改。
|
||||
|
||||
现有上游权威是《SaaS交互_OpenAPI与MQ契约规划_v0.1.md》(正文 v1.0)及经核验的发布产物。现有产物包括 `mq.schema.json`、`executor.openapi.yaml`、`cell-agent.openapi.yaml`、AI 配置及 SIP 管理相关契约。文件存在不代表完整覆盖:P0 必须逐条核对正文、Schema、状态语义和实现差异。
|
||||
|
||||
|
||||
@@ -316,7 +316,7 @@ Dispatcher当前执行:
|
||||
|
||||
完成依据是persistent消息进入指定durable队列/绑定、mandatory无return且publisher confirm成功。仅写本地outbox不算交付完成。通知恢复不要求重取TOKEN或重新PUT,也不因原grant此时过期而重传已上传的文件。
|
||||
|
||||
旧OSS HEAD/verified及oss_id响应已删除,Proto保留原字段编号和名称为reserved。不等待SaaS会话或消费回复,不新增VERIFYING、不发recording.ready;完成不表示SaaS已处理。当前MQ wire为2.0,运行使用v3契约包(AI JCS摘要修订),上传字段沿用已批准的[v2冻结方案](mq-only-v2-freeze-proposal.md)。本地MQ无绑定、确认丢失、重启及原通知恢复已有[证据](../evidence/20260921-mq-upload-progress.md),不等于真实OSS/SaaS联调通过。
|
||||
旧OSS HEAD/verified及oss_id响应已删除,Proto保留原字段编号和名称为reserved。不等待SaaS会话或消费回复,不新增VERIFYING、不发recording.ready;完成不表示SaaS已处理。当前MQ wire为2.0,运行使用唯一 V1 契约包(包含 AI JCS 摘要规则),上传字段沿用已批准的[V1冻结方案](mq-only-v1-freeze-proposal.md)。本地MQ无绑定、确认丢失、重启及原通知恢复已有[证据](../evidence/20260921-mq-upload-progress.md),不等于真实OSS/SaaS联调通过。
|
||||
|
||||
## 7. 错误、幂等与未知结果
|
||||
|
||||
@@ -364,5 +364,5 @@ Agent 侧写操作的内存 operation key 为:
|
||||
- `internal/ai/snapshot.go`
|
||||
- `internal/ai/authorization.go`
|
||||
- `cmd/sip-go-agent/main.go`
|
||||
- `contracts/upstream/2026-09-19-p1-v1/event-payloads.schema.json`
|
||||
- `contracts/upstream/2026-09-19-p1-v1/ai-authorization.schema.json`
|
||||
- `contracts/upstream/v1/event-payloads.schema.json`
|
||||
- `contracts/upstream/v1/ai-authorization.schema.json`
|
||||
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
# MQ-only v2 与 Dispatcher OSS 配置:已确认合同
|
||||
# MQ-only V1 与 Dispatcher OSS 配置:已确认合同
|
||||
|
||||
状态:用户已确认本文件的身份、纯Topic、配置、消息及查询结构;随后通过目标修订确认**上传只负责可靠入队**,并单独确认 `recording.uploaded` 名称/字段及R13完成边界。旧上传会话/verified等待方案被替代,不新增VERIFYING。机读v2包及AI JCS修订后的v3包已生成并通过离线测试;本地运行切换、RabbitMQ往返和联合恢复已有证据,真实SaaS/生产验收仍不在本轮。
|
||||
状态:用户已确认本文件的身份、纯Topic、配置、消息及查询结构;随后通过目标修订确认**上传只负责可靠入队**,并单独确认 `recording.uploaded` 名称/字段及R13完成边界。旧上传会话/verified等待方案被替代,不新增VERIFYING。单一 V1 机读包已包含 MQ-only 与 AI JCS 规则并通过离线测试;本地运行切换、RabbitMQ往返和联合恢复已有证据,真实SaaS/生产验收仍不在本轮。
|
||||
|
||||
机读来源:`contracts/upstream/2026-09-21-p1-v2/`。`manifest.json`记录项目内来源、旧源文件哈希与新文件哈希;不是外部SaaS签收。旧v1包保持原样,不提供运行时v1/HTTP回退。当前目标由本会话Agent独立执行,不启动子Agent。
|
||||
机读来源:`contracts/upstream/v1/`。`manifest.json`记录当前项目内 V1 文件哈希;不是外部SaaS签收。不另设运行时第二套契约或 HTTP 回退。当前目标由本会话Agent独立执行,不启动子Agent。
|
||||
|
||||
## 1. Topic 与租户边界
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
| 层级 | 本次状态 | 使用边界 |
|
||||
| --- | --- | --- |
|
||||
| 已确认设计 | MQ-only、Dispatcher 唯一身份、独立 Topic | 后续设计与实现必须遵守 |
|
||||
| 新版项目内契约 | `2026-09-21-p1-v2`身份/Topic/消息/配置/正反例及哈希,AI JCS修订后的v3包 | 以[mq-only-v2冻结方案](mq-only-v2-freeze-proposal.md)及机读包为准;本地运行往返已有证据,外部SaaS签收仍不在本轮 |
|
||||
| 当前项目内契约 | 唯一 V1 包中的身份/Topic/消息/配置/正反例、哈希和 AI JCS 规则 | 以[mq-only V1冻结方案](mq-only-v1-freeze-proposal.md)及机读包为准;本地运行往返已有证据,外部SaaS签收仍不在本轮 |
|
||||
| 现有实现/旧包 | 下列旧字段、路由及代码事实 | 仅用于识别差异,不代表新设计已实现或通过验收 |
|
||||
|
||||
当前固定包为 `contracts/upstream/2026-09-19-p1-v1/`(`contracts.SourceCommit = 2026-09-19-p1-v1`)。其中的 HTTP OpenAPI 与仅按租户路由的 MQ 拓扑**不再是目标方案**。旧包及其哈希保持不变;W01 须发布新版本、严格 Schema、拓扑及正反例,不能手改旧包、生成字段索引或通过放宽 `additionalProperties` 绕过冻结。
|
||||
当前固定包为 `contracts/upstream/v1/`(`contracts.SourceCommit = v1`)。其中不包含已归档的 HTTP OpenAPI,也不使用仅按租户路由的旧拓扑;当前 V1 包的 Schema、拓扑、正反例和哈希是唯一运行输入。不能在包外另造版本或通过放宽 `additionalProperties` 绕过冻结。
|
||||
|
||||
当前已完成本地实现阶段;v2机读包、AI摘要修订后的v3包、离线正反例、路由规则及RabbitMQ运行往返均有证据。下文§3–§4的v1字段/代码描述仅为迁移差异,不能作为v2/v3接入要求;运行证据不等于外部SaaS签收。
|
||||
当前已完成本地实现阶段;唯一 V1 机读包、AI摘要、离线正反例、路由规则及RabbitMQ运行往返均有证据。下文旧字段/代码描述仅用于解释差异;运行证据不等于外部SaaS签收。
|
||||
|
||||
## 2. 通信拓扑、Dispatcher 身份与交付语义
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
|
||||
### 2.2 全局唯一身份与独立 Topic
|
||||
|
||||
- `dispatcher_id` 是当前v2/v3运行信封和路由中的独立全局身份;每个 Dispatcher 的 ID 必须独立、全局不重复,不能拿租户 ID、Agent ID、Cell ID、地址或启动代次代替。
|
||||
- `dispatcher_id` 是当前 V1 运行信封和路由中的独立全局身份;每个 Dispatcher 的 ID 必须独立、全局不重复,不能拿租户 ID、Agent ID、Cell ID、地址或启动代次代替。
|
||||
- Dispatcher 身份与 `dispatcher_epoch` 分开:前者识别 Dispatcher,后者用于一次运行所有权/会话的 fencing。身份持久绑定、重复身份占用、重启恢复及失效会话拒绝已有本地测试;不因 epoch 改变就丢弃原消息、执行或资产归属。
|
||||
- 每个 Dispatcher 有独立的接收 Topic 及对应队列/绑定;多个 Dispatcher **不能共用一条接收队列竞争消费指定目标的消息,也不能全部订阅同一广播 Topic 后仅靠正文过滤**。
|
||||
- RabbitMQ 的 Topic 订阅由 exchange、routing key、queue 和 binding 表达;当前固定为 `agent-call.dispatchers.v2`、`agent-call.saas.v2`、`agent-call.dead-letter.v2` 及每个 Dispatcher/租户的独立队列和精确路由键,字段以v2/v3机读契约包为准。
|
||||
- RabbitMQ 的 Topic 订阅由 exchange、routing key、queue 和 binding 表达;当前固定为 `agent-call.dispatchers.v2`、`agent-call.saas.v2`、`agent-call.dead-letter.v2` 及每个 Dispatcher/租户的独立队列和精确路由键,字段以唯一 V1 机读契约包为准。
|
||||
- SaaS 发给 D1 的命令、配置、授权和上传结果,只能进入 D1 的专用接收路径;D2 的路径与之独立。D1 发出的响应/事件须能回溯 D1 与原请求。SaaS 订阅布局亦由同一版契约定义,不假定现有共享结果队列已满足新约束。
|
||||
- 独立 Dispatcher 路由不替代租户隔离:保留租户独立队列、有界窗口、原值 `tenant_key` 和复合幂等语义;新拓扑必须同时区分 Dispatcher 与租户,不能退化为 Dispatcher 内所有租户共享无界队列。
|
||||
- `tenant_key` 不清洗、编码或截断。旧布局的 224 UTF-8 字节预算不能在加上 Dispatcher 身份后直接照搬;W01 须校验完整 routing key/queue 名长度及分隔符、通配符边界,超限拒绝发布并保留源任务,不改变既有租户标识。
|
||||
@@ -66,7 +66,7 @@ P1 仍只运行一个单活 Dispatcher。现在必须在合同及本地路由测
|
||||
| dead-letter exchange | `agent-call.dead-letter.v1`,durable `topic` | 恢复必须保留原 Dispatcher、租户和消息身份 |
|
||||
| 默认 prefetch | `1` | 保持有界消费;不是多 Dispatcher 隔离证明 |
|
||||
|
||||
旧实现按消费租户声明 command queue 和 `.dlq.v1`,SaaS 结果队列基线为 `agent-call.saas.events.v1`、binding `agent-call.#`。这些名称仅记录旧包事实,不构成新拓扑批准;当前运行使用v2/v3精确 Dispatcher/租户路由。
|
||||
旧实现按消费租户声明 command queue 和 `.dlq.v1`,SaaS 结果队列基线为 `agent-call.saas.events.v1`、binding `agent-call.#`。这些名称仅记录旧实现事实,不构成当前拓扑;当前 V1 运行使用精确 Dispatcher/租户路由。
|
||||
|
||||
### 3.2 旧 `call.execute` 外壳
|
||||
|
||||
@@ -188,7 +188,7 @@ v2已用`recording.uploaded`取代本项目的`recording.ready`;不得返回
|
||||
|
||||
### 5.1 待冻结内容
|
||||
|
||||
消息类型、信封和响应枚举以已确认的v2机读包及[mq-only-v2合同](mq-only-v2-freeze-proposal.md)为准。旧HTTP header、URL和状态码不是MQ合同,不能塞进旧call.execute或宽松metadata中。
|
||||
消息类型、信封和响应枚举以唯一 V1 机读包及[mq-only V1合同](mq-only-v1-freeze-proposal.md)为准。旧HTTP header、URL和状态码不是MQ合同,不能塞进旧call.execute或宽松metadata中。
|
||||
|
||||
### 5.2 控制任务
|
||||
|
||||
@@ -247,4 +247,4 @@ D 根据 MQ 任务中的原 `tenant_id/tenant_key + agent_version_id`,通过 M
|
||||
- [时间泳道图](./saas-rabbitmq-oss-dispatcher-agent-timeline.md):已按当前recording.uploaded边界更新;外部SaaS/真实OSS处理仍不在本地证据范围。
|
||||
- [Dispatcher ↔ Agent 契约](./dispatcher-agent.md):现有 Proto/handler 事实、15分钟授权和上传通知恢复边界。
|
||||
- 旧实现事实:`internal/contract/contract.go`、`internal/mq/amqp.go`、`internal/tenant/routing.go`、`internal/dispatcher/consumer.go`、`internal/dispatcher/dispatcher.go`、`internal/store/store.go`、`internal/store/facts.go`。旧HTTP源码仅可在历史基线中查阅,不是当前运行路径。
|
||||
- 旧固定包:`contracts/upstream/2026-09-19-p1-v1/` 下 `mq.schema.json`、`event-payloads.schema.json`、`mq-topology.md`、`executor.openapi.yaml`、`saas.openapi.yaml`、`ai-config.openapi.yaml`;保留原样,不代表 MQ-only 新契约已发布。
|
||||
- 当前固定包:`contracts/upstream/v1/` 下的 `mq.schema.json`、`event-payloads.schema.json`、`mq-topology.json`、AI/Dispatcher/OSS/静态 Cell Schema 及业务正反例;归档目录中的旧 OpenAPI 和历史包不属于运行输入。
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- **上传只保证recording.uploaded可靠进入指定持久队列**。不申请SaaS上传会话,不等待verified/OSS ID,不新增VERIFYING,不把入队当SaaS已处理。
|
||||
- P1单D/单A/单Cell/单租户;D1/D2只用于本地消息隔离验证,不扩展调度HA。
|
||||
|
||||
本图为目标流程;v2 Schema/fixture通过不等于运行时接线或真实供应商验收。精确消息见[已确认v2合同](mq-only-v2-freeze-proposal.md)与`contracts/upstream/2026-09-21-p1-v2/`。
|
||||
本图为目标流程;V1 Schema/fixture通过不等于运行时接线或真实供应商验收。精确消息见[已确认V1合同](mq-only-v1-freeze-proposal.md)与`contracts/upstream/v1/`。
|
||||
|
||||
## 2. 独立订阅关系
|
||||
|
||||
@@ -111,6 +111,6 @@ sequenceDiagram
|
||||
|
||||
## 5. 当前实现差异
|
||||
|
||||
旧SaaS业务HTTP实现和启动配置已删除,执行、查询、控制、AI请求及上传通知已接入v2/v3 MQ。本地证据覆盖D身份/租户隔离、不可路由、confirm/DLQ、断连、重复、迟到revision、SQLite重启和recording.uploaded恢复;不得把这些本地证据当作外部SaaS或生产通过。
|
||||
旧SaaS业务HTTP实现和启动配置已删除,执行、查询、控制、AI请求及上传通知已接入单一 V1 MQ。本地证据覆盖D身份/租户隔离、不可路由、confirm/DLQ、断连、重复、迟到revision、SQLite重启和recording.uploaded恢复;不得把这些本地证据当作外部SaaS或生产通过。
|
||||
|
||||
旧会话/verified控制流程已移出目标,不再为它增加RPC、状态或测试服务器业务系统。通知重复/确认丢失/重启沿原消息身份恢复,不重新PUT、不新建资产、不重拨;SaaS后续处理不属于本项目。
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
| 门禁 | 本地结果 | 证据/未决项 |
|
||||
| --- | --- | --- |
|
||||
| G0 / W01 契约发布 | **本地通过 / 外部阻塞** | 项目内 `contracts/upstream/2026-09-18-p1-baseline` 已完成严格事件/双模式 AI/授权/OSS/静态制品/profile Schema、正反例与哈希;明确继承 dirty source 且非外部权威,真实预算/授权仍未签收。 |
|
||||
| G0 / W01 契约发布 | **本地通过 / 外部阻塞** | 项目内 `contracts/archive/upstream/2026-09-18-p1-baseline` 已完成严格事件/双模式 AI/授权/OSS/静态制品/profile Schema、正反例与哈希;明确继承 dirty source 且非外部权威,真实预算/授权仍未签收。 |
|
||||
| W02 Unary Proto/会话 | **本地通过 / 集成待验证** | `agent.v1.AgentControlService` Proto、生成 stubs、`proto/ERRORS.md`、Buf manifest 和生成/handler 测试通过;Dispatcher/Agent部署级运行会话仍需联测。 |
|
||||
| W03-a 工具链/依赖 | **本地通过** | `go.mod` Go 1.27.1、Cobra 双子命令、`go mod verify`、依赖许可证清单和 `govulncheck@v1.7.0` 无漏洞扫描;ARI/LLM/ASR/TTS 隔离 API/协议 Mock PoC 已记录,正式锁版和真实供应商仍未验收。 |
|
||||
| W03-c SQLite/MQ PoC | **本地通过 / 外部未验收** | inbox、幂等、outbox、publisher-confirm 边界、租户队列/版本化 exchange、lease、配额和控制 CAS 有 race 单测;`make mq-integration-local` 以 disposable RabbitMQ 4.1.8 验证 adapter confirm/ACK/permanent reject→DLQ/consumer cancellation,并验证 Dispatcher tenant consume→SQLite inbox/task/outbox→event publish;当前候选二进制另在 owner-authorized ECS 通过隔离 RabbitMQ 完成 `routed=true`、`inbox=1/task=1/outbox=1`,再由候选 Dispatcher flush 为 `task_status=accepted/outbox_status=published`(证据:`docs/evidence/20260918-rabbitmq-integration.md`);SaaS 侧使用版本化 contract/fixture Mock,边界记录在 `docs/evidence/20260919-local-saas-contract-mock.md`;没有批准 broker 版本/ACL/崩溃注入/SaaS application receipt。 |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
The user selected **provide formal W01/W02 artifacts and continue**. The only
|
||||
new candidate found in the parent worktree was copied read-only into
|
||||
`contracts/upstream/2026-09-17-snapshot/` and verified against its recorded
|
||||
`contracts/archive/upstream/2026-09-17-snapshot/` and verified against its recorded
|
||||
file hashes.
|
||||
|
||||
It is not yet a formal release:
|
||||
|
||||
@@ -49,7 +49,7 @@ repository is `go-sip`; local release manifests preserve the historical fact.
|
||||
|
||||
## References
|
||||
|
||||
- Project baseline: `contracts/upstream/2026-09-18-p1-baseline/`
|
||||
- Project baseline: `contracts/archive/upstream/2026-09-18-p1-baseline/`
|
||||
- Local evidence: `docs/evidence/20260918-local-development.json`
|
||||
- W05 SQLite restart evidence: `docs/evidence/20260918-w05-restart.md`
|
||||
- W06/W12 targeted local evidence: `docs/evidence/20260918-w06-w12-local.md`
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"scope": "go-sip local development only",
|
||||
"working_tree": "dirty-project-worktree",
|
||||
"source_contract": {
|
||||
"active_bundle": "contracts/upstream/2026-09-18-p1-baseline",
|
||||
"active_bundle": "contracts/archive/upstream/2026-09-18-p1-baseline",
|
||||
"release_kind": "project-owned-development-baseline",
|
||||
"external_authority": false,
|
||||
"source_bundle": "2026-09-17-snapshot",
|
||||
|
||||
@@ -9,7 +9,7 @@ The second Cell is intentionally out of this iteration.
|
||||
|
||||
## Completed
|
||||
|
||||
- Active contract bundle is `contracts/upstream/2026-09-19-p1-v1`.
|
||||
- Active contract bundle is `contracts/upstream/v1`.
|
||||
- `static-cell-artifact-v1.json` validates as `mode=real` with ARI, per-trunk
|
||||
media profiles, the three provider bindings selecting PCMA/A-law 8 kHz RTP
|
||||
payload type 8 (plus an optional slin16/16 kHz profile), and 0600-WAV
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"environment": "mock",
|
||||
"synthetic_only": true,
|
||||
"purpose": "Verify the PCMA/A-law trunk media profile through the Go call-once ARI flow.",
|
||||
"contract": "contracts/upstream/2026-09-19-p1-v1",
|
||||
"contract": "contracts/upstream/v1",
|
||||
"candidate_package": "deploys/packages/sip-go-agent-0.1.0-p1.20260919-linux-amd64.tar.gz",
|
||||
"candidate_sha256": "bc106f733e26354221c18c7bb593eca84a4267dec3156f80311eb30f630e7b84",
|
||||
"test_setup": {
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
- Go/Python 复用 `github.com/cyberphone/json-canonicalization`,固定 `v0.0.0-20241213102144-19d51d7fe467`;不自写规范化算法。
|
||||
- `ai.Validate` 保留原始配置字节,但摘要取 JCS 结果;拒绝非法 UTF-8,不接受旧摘要回退。
|
||||
- 新包:`contracts/upstream/2026-09-21-p1-v3/`,MQ 线上的 `schema_version` 仍为 `2.0`。
|
||||
- manifest SHA-256:`e09e8563f4a7bc9d70e3a4b9782efbaeca8858965433cefb1b60355115159d1c`。
|
||||
- v1/v2 不可变包保持原样。发布器从校验过的 v2 文件生成新包,在离线正反例和 AI Schema 校验后发布;已存在目标若内容不同,明确失败。
|
||||
- 唯一活动包:`contracts/upstream/v1/`,MQ 线上的 `schema_version` 仍为 `2.0`。
|
||||
- 当前 V1 `manifest.json` SHA-256:`d1218691ad8f63d3c7de0b652246ace690191f932a5107dbece34ccbac83bf7e`。
|
||||
- 不再维护并行契约包;当前 V1 文件经离线正反例和 AI Schema 校验后作为唯一运行输入。
|
||||
- Python 生成的数值、UTF-16 属性排序和字符串黄金向量,由 Go 验证规范字节及 SHA-256 一致。
|
||||
|
||||
## 验证事实
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
## 未完成,不能签收全流程
|
||||
|
||||
- `contracts.SourceCommit`仍为v1;业务消费、事件构建、outbox路由和必要请求响应尚未整体切到v2。MQ传输测试不证明完整业务已接通。
|
||||
- `contracts.SourceCommit`固定为 `v1`;业务消费、事件构建、outbox路由和必要请求响应统一使用该 V1 包。MQ传输测试仍不证明真实外部业务已接通。
|
||||
- 旧HTTP入口、CLI/环境中的旧配置选项及旧集成测试仍需清理;配置文件权威来源已接入不等于所有旧入口已删除。
|
||||
- Broker连接丢失的通知已暴露,但所有准入/许可路径的停止联动还需验证。
|
||||
- 上传仍待改为recording.uploaded及正确的R13完成边界;未验证通知恢复不重复PUT。
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
- 新增嵌入式Schema loader及编译结果复用;跨文件引用只取指定契约包,外部URL、跨版本和越界文件名被拒绝,不访问网络。
|
||||
- 新服务消息使用已批准字段`message_type`,不是`message_kind`或`request_type`。
|
||||
- 非法UTF-8曾被当作可重试错误;真实失败测试后改为明确的无效消息错误分类,避免反复回队。
|
||||
- 当前全局`contracts.SourceCommit`及执行/事件旧流程仍未整体切v2;新查询明确固定v2,不尝试旧协议回退。
|
||||
- 当前全局`contracts.SourceCommit`及执行/事件流程统一固定为 `v1`;新查询同样使用该唯一契约包,不尝试旧协议回退。
|
||||
|
||||
## 实际测试
|
||||
|
||||
|
||||
+7
-7
@@ -1,4 +1,4 @@
|
||||
# MQ-only v2:项目内契约验证
|
||||
# MQ-only V1:项目内契约验证
|
||||
|
||||
## 范围与授权
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
|
||||
## 产物
|
||||
|
||||
- 新包:`contracts/upstream/2026-09-21-p1-v2/`。
|
||||
- `scripts/publish-mq-v2.py`从只读v1来源和已确认规则生成37个被manifest固定哈希的文件;manifest另存旧源文件哈希,不依赖不存在的旧manifest。
|
||||
- 唯一活动包:`contracts/upstream/v1/`。
|
||||
- 当前 V1 包包含 50 个由 `manifest.json` 固定哈希的文件;历史发布脚本已移至归档,不作为运行输入。
|
||||
- `mq.schema.json`包含4类命令、8类事件、3组必要查询/AI请求响应;没有上传会话/complete/verified往返协议。
|
||||
- `event-payloads.schema.json`仅允许已确认上传事实字段,不接受SaaS OSS ID、TOKEN、密钥或签名URL。
|
||||
- `dispatcher-config.schema.json`拒绝未知配置、直接密钥字段及TTL覆盖;`mq-topology.json`固定持久队列、persistent、mandatory和confirm要求。
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
当前manifest SHA-256:
|
||||
|
||||
`6ca4582ab5f0b5550508deaa9f0b3d6e6bac579f108b423be3a7c133a207ad33`
|
||||
`d1218691ad8f63d3c7de0b652246ace690191f932a5107dbece34ccbac83bf7e`
|
||||
|
||||
## 实际验证
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
| 正反例 / 离线引用解析 | 通过,测试loader拒绝网络读取 |
|
||||
| 所有成功消息分支 | 有实际正例,不只编译空Schema |
|
||||
| 非法D身份、通配词段、旧版本、额外字段、缺关联 | 拒绝 |
|
||||
| 旧recording.ready及SaaS上传握手 | v2拒绝/移除 |
|
||||
| 旧recording.ready及SaaS上传握手 | V1拒绝/移除 |
|
||||
| uploaded中的OSS ID/TOKEN/密钥/URL | 拒绝 |
|
||||
| 查询结果未知字段 | 先暴露旧源Command/Call未闭合问题,再关闭对象并通过反例 |
|
||||
| 路由模板与Go实现 | 三个topic exchange、队列/路由模板、196字节边界和900秒TOKEN合同一致 |
|
||||
| manifest全部文件与旧源 | 新文件哈希通过;`git diff --exit-code 704652b -- contracts/upstream/2026-09-19-p1-v1`无差异 |
|
||||
| manifest全部文件 | 当前 V1 文件哈希通过 |
|
||||
| `go test -race ./contracts ./internal/tenant -count=1` | 通过 |
|
||||
| `go vet ./...`、`go test -race ./...`、构建 | 通过,外部broker/provider/OSS集成开关显式清除 |
|
||||
| 格式与`git diff --check` | 通过 |
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
## 未覆盖/仍待实现
|
||||
|
||||
- 运行时`contracts.SourceCommit`尚为v1,须在后续接线中统一切换;不能据此声称当前服务已经发送v2消息。
|
||||
- 运行时`contracts.SourceCommit`固定为 `v1`;不存在第二套运行时契约版本。
|
||||
- 未实际启动本地RabbitMQ或完成D1/D2隔离、消息入队与confirm故障实验;这是后续集成门禁。
|
||||
- 旧SaaS业务HTTP、旧上传完成handler及OSS ID返回路径尚待替换,不新增VERIFYING。
|
||||
- 全项目覆盖率尚未达到65%;不能以局部契约/路由通过代签整体质量目标。
|
||||
+5
-5
@@ -22,7 +22,7 @@
|
||||
需求依据顺序:
|
||||
|
||||
1. 当前适用的用户确认和 [项目约束](../AGENTS.md)。已确认方向不重复索要审批;缺失字段、预算及偏离方案的变更不能自行补成“已批准”。
|
||||
2. 外部字段/路径/状态在外部权威闭包可用时来自上游版本化契约包;当前运行使用项目内只读 `contracts/upstream/2026-09-18-p1-baseline` 开发基线,并明确标注其非外部权威来源。内部接口来自项目内 `agent.v1` Proto;不能将未进入上述包的说明文字当作 Schema。
|
||||
2. 外部字段/路径/状态在外部权威闭包可用时来自上游版本化契约包;早期项目内 W01 基线已归档至 `contracts/archive/upstream/2026-09-18-p1-baseline`,当前代码只使用项目内唯一的 `contracts/upstream/v1` 契约包;未发生契约迁移前不新增或合并契约。内部接口来自项目内 `agent.v1` Proto;不能将未进入当前契约包的说明文字当作 Schema。
|
||||
3. [G0确认方案](G0开发准备与契约冻结提案_v0.1.md)记录最新确认和待交付门禁;总体、通信、组件和验收文档补充实施细则。
|
||||
4. 本计划只编排任务和阅读入口。若发现来源冲突,列明两个出处并暂停受影响部分;不得用计划、旧实现或 SDK 默认值覆盖权威合同。
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
2. **每个 Dispatcher 有全局唯一、不重复的 ID 和独立接收 Topic/队列**。消息必须定向到指定 D,响应回原 D,来源可追溯;不能多个 D 共用一条队列竞争消费或广播后过滤。Dispatcher 身份不等于 tenant/Agent/Cell ID 或 `dispatcher_epoch`,租户独立队列与原值 `tenant_key` 仍保留。
|
||||
3. 精确 ID 生成/持久化/重复身份处理、Topic/队列/绑定命名、信封关联/错误/超时以及新 routing key 的完整字节预算须由 W01 冻结;方向已经确认,但不能自行往严格旧 Schema 加字段。P1仍是单活 D,D1/D2 路由隔离只作本地契约/消息 fixture,不新增多 D 调度、HA、共享额度或生产资源。
|
||||
4. **D↔A 仍为 Unary,A→OSS 仍直传**。MQ-only 不禁止 OSS/ARI/供应商 HTTP(S) 或 gRPC HTTP/2。OSS 配置由 D 配置文件提供,临时 TOKEN 由 D 向 A 提供,不再由 SaaS 下发;保留 D 签发能力。R12 提供原请求绑定的临时授权;R13 持久保存上传事实及原通知身份,并以指定队列可靠入队作为本项目完成条件。不等待 SaaS 处理,也不把本地 outbox 写入等同 MQ 入队。
|
||||
5. 旧 AI GET、控制/查询/补传 HTTP 和上传 HTTP 方案被本修订替代;`contracts/upstream/2026-09-19-p1-v1/`、旧版本、生成索引及历史证据保留原样,不能当作 MQ-only 新合同或重写哈希。相关新版本和正反例发布前,受影响 I 不就绪;禁止先实现猜测消息再补合同。
|
||||
6. 文档修订阶段已结束;当前目标已获批准实施本项目契约、代码、配置和测试,由当前Agent独立执行,不启动子Agent。已确认细节见[MQ-only v2冻结方案](contracts/mq-only-v2-freeze-proposal.md),不重开已批准方向;仍不访问真实SaaS/供应商/云/拨号,本地隔离broker可用于合同测试。文档或局部代码完成不关闭§8.2联合门禁。
|
||||
5. 旧 AI GET、控制/查询/补传 HTTP 和上传 HTTP 方案被本修订替代;`contracts/upstream/v1/` 是当前代码唯一使用的项目内 V1 合同包;未使用的旧快照和 OpenAPI 已移至 `contracts/archive/upstream/`,不能在包外另造兼容合同或绕过其哈希。未发生契约迁移前不新增或合并契约;禁止先实现猜测消息再补合同。
|
||||
6. 文档修订阶段已结束;当前目标已获批准实施本项目契约、代码、配置和测试,由当前Agent独立执行,不启动子Agent。已确认细节见[MQ-only V1冻结方案](contracts/mq-only-v1-freeze-proposal.md),不重开已批准方向;仍不访问真实SaaS/供应商/云/拨号,本地隔离broker可用于合同测试。文档或局部代码完成不关闭§8.2联合门禁。
|
||||
|
||||
目标语义见 R8,当前内部实现事实与差异见 R9,完整 MQ 目标时序见 R10。R1–R6 或历史证据中与本修订冲突的旧传输、路由及通过结论,不得继续作为新接入依据;只读来源包的变更必须走新版本发布。
|
||||
|
||||
@@ -229,7 +229,7 @@ go build ./...
|
||||
| 步骤 | 当前状态 | 历史证据/原基线结论(不代表新修订通过) | 当前下一动作 |
|
||||
| --- | --- | --- | --- |
|
||||
| W00 | 完成 | 已读 AGENTS、计划与 R0/R1/R3/R4/R5;工具链为 Go 1.27.1;已记录父工作区既有改动和契约源 commit。证据:`docs/evidence/20260918-local-development.json` | 维护本地基线并按 W04 证据门禁推进 |
|
||||
| W01 | 完成 | 项目内 `contracts/upstream/2026-09-18-p1-baseline` 已形成自包含版本、严格事件/AI/授权/OSS/静态制品/profile Schema、8种事件正例和负例、README/SNAPSHOT/release-manifest/父清单哈希;明确继承 source dirty 且非外部权威。证据:W01 bundle、`internal/contract` 与 `internal/ai` 测试 | 发布MQ-only新契约及正反例,见§8.2;外部签收与本地冻结分开 |
|
||||
| W01 | 完成 | 当前唯一 `contracts/upstream/v1` 已收敛为严格事件/AI/授权/OSS/静态制品/profile Schema、正反例、路由预算及JCS向量;早期 W01 基线仅作为归档文件。证据:V1 bundle、`internal/contract` 与 `internal/ai` 测试 | 外部签收与本地冻结分开;未发生契约迁移前不新增契约 |
|
||||
| W02 | 完成 | `proto/agent/v1/agent.proto`、`gen/agent/v1/*`、`proto/ERRORS.md`、manifest 已交付;`buf lint/build/generate` 和生成包测试通过,覆盖 R01–R03/R05/R07–R13,不建 R04/R06 空壳 | 核验D身份/epoch和R12/R13的MQ异步衔接,按需冻结Proto变更,见§8.2 |
|
||||
| W03 | 完成 | W03-a 单 module/Cobra/构建基线、W03-c 存储/MQ 本地实现、W03-e AI Schema/contract SaaS Mock PoC、W03-d Pion RTP thin adapter、gopsutil 资源采样已有测试;已完成 Go module 许可证清单、`go mod verify` 和 `govulncheck@v1.7.0`(Go 1.27.1 构建)无漏洞扫描;临时 module 的 `ari/v5.3.1`、`openai-go/v3.62.0`、`dashscopego/v0.1.2`、`doubao-speech-go` API/协议 Mock PoC 通过但均未锁入项目;固定 Asterisk 22.10.1 + 临时 ARI client runtime PoC 已通过内部 Stasis/bridge/ExternalMedia lifecycle;PJSIP/PJSUA2 full mock leg 已通过双向 PCMA、U1/U2/U3 播放、端点 WAV 封口和 ARI cleanup(证据:`docs/evidence/20260918-w09-sip-rtp-ari.md`);一次 disposable RabbitMQ 4.1.8 broker confirm/ACK/DLQ 集成通过,并新增 Dispatcher tenant consume→SQLite inbox/task/outbox→event publish integration test;另以 `TestOutboxProcessCrashRecovery` 覆盖一次真实测试子进程在 outbox claim 后退出、父进程恢复并发布的本地故障窗口(证据:`docs/evidence/20260918-w05-restart.md`);2026-09-19 另锁定物理 Asterisk 22.10.1 source/native-stage、Jansson 2.15.0、PJPROJECT 2.17 和 Debian 13 systemd 构建/安装输入,依赖补充证据见 `docs/evidence/20260918-dependencies.md`,`make check`、脚本语法和 deployment lock JSON 检查通过 | 本阶段项目内 Go/SDK/契约/隔离验证已签收;生产 ARI module/tag/许可证、供应商真实 SIP/媒体、录音 retention/OSS、批准 broker 版本/ACL、真实 broker/commit 故障注入属于第二阶段;隔离 SIPp-to-PJSIP/ARI signaling 证据见 `docs/evidence/20260918-w09-sip-ari.md`,不把本地或隔离 PoC 当生产通过 |
|
||||
| W04 | 完成 | W01/W02 项目内产物和 D10 隔离 PoC 已具备;本阶段项目内 G0 契约、Schema、fixture、隔离 PoC 和范围修订已签收;外部权威、真实预算/角色签收、生产依赖及生产运行证据属于第二阶段,不计入本轮门禁;汇总:`docs/evidence/20260918-g0-status.md` | 汇总新MQ合同及本地PoC,重新签收受影响G0,见§8.2 |
|
||||
@@ -261,7 +261,7 @@ go build ./...
|
||||
|
||||
| 工作包 / 当前状态 | I/M/G 与下一动作 | 解除条件 |
|
||||
| --- | --- | --- |
|
||||
| W01 / 完成 | v2/v3契约包、严格Schema/正反例、D身份/路由预算及JCS摘要通过;见`20260921-mq-v2-contracts.md`、`20260921-ai-jcs-digest.md`、`20260922-mq-only-local-final.md` | 仅外部签收仍不在本轮 |
|
||||
| W01 / 完成 | 单一 V1 契约包、严格Schema/正反例、D身份/路由预算及JCS摘要通过;见`20260921-mq-v1-contracts.md`、`20260921-ai-jcs-digest.md`、`20260922-mq-only-local-final.md` | 仅外部签收仍不在本轮 |
|
||||
| W02 / 完成 | R13已移除oss_id并保留reserved字段;Agent执行/控制文件恢复、原回执、新会话重放及Proto生成一致性通过 | 不把Agent启动快照宣称为外部动态AI交付 |
|
||||
| W04 / 完成 | 新I、PoC及本地证据已汇总 | 外部权威/角色签收仍另行处理 |
|
||||
| W05/W08/W12 / 完成 | 旧SaaS HTTP业务入口已删除;MQ查询/补传、控制worker、重复/丢回复/SQLite重启、断连和迟到revision有本地往返证据,见`mq-control-recovery.md`、查询/补传证据及`20260922-mq-only-local-final.md` | 外部SaaS receipt不在本轮;accepted不等于applied,不重发执行当补传 |
|
||||
|
||||
Reference in New Issue
Block a user