diff --git a/README.md b/README.md index 6480345..ccc209a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 独立 Go SIP 调度与执行项目。单一 Go 1.27.1 module/制品通过 Cobra 显式提供 `dispatcher`、`agent` 两个业务子命令;当前业务启动只允许**隔离 Mock**,mixed/real 直接拒绝。目标是分阶段以 Go 替换 Agent,不重写 Asterisk,也不建立第二套 SaaS 管理后台。项目的源码、文档、依赖、构建、测试、配置和发布入口均在本仓库内。 -> **范围与进度:** [当前实施与验收入口](docs/plan-saas-dispatcher.md)记录 P01–P06 本地已验证、P07 文档/残留清理进行中、P08 最终 A01–A12/K01–K16 与 ≥65% 业务覆盖率对照待完成。隔离 RabbitMQ、双向 TLS/HTTPS、OSS PUT 与 AI Mock 的通过,不代表真实 SaaS、管理平台、MQ 应用收讫、OSS/AI 供应商、Asterisk/SIP/ECS、真实拨号或生产切换已验证;当前发布清单 `production_approval=false`。真实试拨另需逐次授权,并遵守白名单、Asia/Shanghai `09:00`–`20:00` 及拨号前诊断抓包门禁。 +> **范围与进度:** [当前实施与验收入口](docs/plan-saas-dispatcher.md)记录 P01–P07 项目内已验证,以及 P08 最终 A01–A12/K01–K16 与 ≥65% 业务覆盖率对照待完成。隔离 RabbitMQ、双向 TLS/HTTPS、OSS PUT 与 AI Mock 的通过,不代表真实 SaaS、管理平台、MQ 应用收讫、OSS/AI 供应商、Asterisk/SIP/ECS、真实拨号或生产切换已验证;当前发布清单 `production_approval=false`。真实试拨另需逐次授权,并遵守白名单、Asia/Shanghai `09:00`–`20:00` 及拨号前诊断抓包门禁。 ## 唯一当前接口 diff --git a/docs/README.md b/docs/README.md index 7154ea7..1d4be1a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,7 +7,7 @@ 1. [`plan-saas-dispatcher.md`](plan-saas-dispatcher.md):P01–P08 当前实施进度、A01–A12/K01–K16 验收与未验证边界。 2. [`thirds/saas-dispatcher.md`](thirds/saas-dispatcher.md):唯一现行 SaaS↔Dispatcher 项目内通信说明,五类只读 HTTP、固定 `v1` MQ、归属、控制、唯一结果与上传恢复。 3. [`../contracts/local/manifest.json`](../contracts/local/manifest.json) 与 [`../contracts/local/`](../contracts/local/):唯一当前机器 Schema、拓扑、正反例和不可变来源/hash;内部 Agent RPC 见 [`../proto/agent/agent.proto`](../proto/agent/agent.proto)。Markdown 不代替机器校验。 -4. [`evidence/saas-dispatcher-implementation.md`](evidence/saas-dispatcher-implementation.md):本地测试、故障/重启与未验证项的可核查证据。 +4. [`evidence/saas-dispatcher-implementation.md`](evidence/saas-dispatcher-implementation.md):本地测试、故障/重启与未验证项的可核查证据;[`evidence/saas-dispatcher-p07-audit.md`](evidence/saas-dispatcher-p07-audit.md) 逐项核查旧入口、历史例外与来源/hash。 5. [`../AGENTS.md`](../AGENTS.md):本独立项目开发、SIP、部署、真实呼叫与诊断约束。 ## 其它文档 diff --git a/docs/evidence/saas-dispatcher-implementation.md b/docs/evidence/saas-dispatcher-implementation.md index 4a53526..1674b77 100644 --- a/docs/evidence/saas-dispatcher-implementation.md +++ b/docs/evidence/saas-dispatcher-implementation.md @@ -154,4 +154,4 @@ ## 验收台账 -P01–P06 的项目内隔离证据见上;P07 全仓命名与唯一入口尚在清理,A01–A12 和 K01–K16 的最终对照仍待 P08。不得用本地 Mock 冒充外部签收。 +P01–P07 的项目内隔离证据见上;P07 唯一当前入口、全仓残留/合法例外及来源/hash 的逐项结果见 [`saas-dispatcher-p07-audit.md`](saas-dispatcher-p07-audit.md)。A01–A12 和 K01–K16 的最终逐项对照、业务覆盖率及诊断门禁仍待 P08。不得用本地 Mock 冒充真实 SaaS、management、MQ、OSS、AI、Asterisk、SIP、ECS 或生产签收。 diff --git a/docs/evidence/saas-dispatcher-p07-audit.md b/docs/evidence/saas-dispatcher-p07-audit.md new file mode 100644 index 0000000..5f5042e --- /dev/null +++ b/docs/evidence/saas-dispatcher-p07-audit.md @@ -0,0 +1,23 @@ +# P07:唯一现行入口残留与合法例外核查 + +范围:分支 `feat/saas-dispatcher-contract`,实施基线 `f5c2d6a92036a579e0b070beb1d9381b0976f81e`;逐批清理和测试事实见 [`saas-dispatcher-implementation.md`](saas-dispatcher-implementation.md)。本表只确认**项目内隔离 Mock 的现行入口与历史隔离**,不证明 SaaS、management、真实 MQ、OSS/AI 供应商、Asterisk、SIP、ECS 或生产已验收。两份使用者修改的 `docs/thirds/v0.4.md`、`docs/thirds/第三方对接事件与请求消费顺序_v0.1.md` 未暂存、覆盖或清理。 + +| 范围 | 残留核查及可复核结果 | +| --- | --- | +| Go 入口与命名 | `rg --files cmd internal gen proto contracts/local scripts deploys` 筛查 `_v2/_v3`、`v0.x`、`agent_v*`/`dispatcher_v*` 活动文件名:**无匹配**;生产 Go 源扫描 `ReadLocal`、`LocalV*`、`V3Broker`、旧 Agent/Dispatcher 构造及已废弃 MQ 字段:**无匹配**。根命令只有显式 `agent`/`dispatcher`,mixed/real 启动即拒绝;Agent、Dispatcher、AI、部署配置的自有 `Current` 构造和文件名已按职责改名,三组 AST/文件名回归测试固定此边界。死代码 `internal/calllog` 与旧 `internal/testfixture` 已删除,不提供旧版本回退。 | +| Schema/来源 | `contracts/local/` 只有五份当前顶层 JSON(含 `manifest.json`)和 30 份正反例;34 份 JSON 构成当前合同包,四代旧本地 JSON 共 17 份原字节归档在 `docs/archive/contracts-local-history/`。`contracts.Files` 只嵌入当前本地顶层/示例及单独的上游历史来源,`contracts.ReadCurrent` 与 `contract.ValidateCurrent` 严格拒绝旧本地 Schema 和未知字段;布局测试、正反例、三份文档来源 SHA-256、bundle hash 由 `make check` 核对。旧方案不能通过目录位置、缓存或 MQ 回退重新进入业务。 | +| SQLite/恢复 | `internal/store/` 没有旧 migration SQL;`Store.Open` 在写表前检查既有表和 `user_version`,旧/残缺布局保留原数据并拒绝,测试包含未知占用、会话/结果/上传 outbox 故障与重启。Agent 旧 `.executions`、`.uploads`、`.upload-locks` 及执行 `state.json` 的检查只读失败关闭;未自动清空、迁移、重拨或将未知 PUT 当失败重传。本次只删除无人调用的源码与样例,没有处置任何用户存量文件。 | +| Proto 与 Agent | `proto/agent/agent.proto` 的 `AgentControlService` 恰好八个获批 RPC:状态、激活、获批执行/控制、已加载 SIP、录音授权、结束、结果;`scripts/check-proto.sh` 校验 `gen/` 与 `proto/manifest.json` 来源/生成 hash。`agent.v1` 是仍在使用的**内部通信协议标识**,没有旧业务 RPC 兼容服务。 | +| MQ、HTTP 与脚本 | 五类只读 HTTP 来自当前合同;控制/任务队列由 SaaS 预建、Dispatcher 无 configure 权限;结果进入同一 durable 队列,mandatory/return/confirm 与原身份恢复按当前 schema/拓扑测试。`scripts/check-current-mq-mock.sh` 明确要求 `TestBrokerSharedResultQueueAndNoConfigure`、`TestRuntimeIsolatedControlBacklogExecuteAndSharedResult`、`TestDispatcherCommandStartsWithIsolatedMQHTTPAndAgent` **三项均实际 PASS**,匹配零项不得算通过。当前 release/build 检查绑定本地合同、MQ 拓扑、上游历史来源和 Proto manifest 的 SHA-256;`production_approval=false`,不拨号、不部署。 | +| 文档、部署及链接 | `AGENTS.md`、根 `README.md`、`docs/README.md`、[`../plan-saas-dispatcher.md`](../plan-saas-dispatcher.md) 只把 `docs/thirds/saas-dispatcher.md`、当前机器合同和本证据作为当前入口。12 份当前/归档索引中的 Markdown 相对链接全部解析成功;旧部署 JSON 原字节归档并以来源路径/SHA-256 映射,物理部署说明明确当前制品 Mock-only。原计划 `docs/plan-saas-dispatcher-v05-v0.1.md` 仍在原路径且 SHA-256 为 `666f39e56ea9f4b55661efcac82edd6f9729848e2d60e5f24cdf5aa3ac97ee87`,由当前 `contracts/local/manifest.json` 固定为历史来源,不改写为新计划,也不保留旧运行入口。 | + +## 已核实的名称例外(均不是旧业务分支) + +| 保留项 | 原因与限制 | +| --- | --- | +| MQ `agent-call.*.v1`、HTTP `/internal/v1/dispatcher/...`、Proto `proto/agent/v1` / `agent.v1` | 当前约定的线协议及路径,删改会破坏现行机器合同;没有第二条旧版执行通道。 | +| `task_revision`、`sip_revision`、`quota_revision`、会话代际、release 的版本号 | 授权/加载/持久判重或制品身份事实,不是项目自造的替代通信版本。`deploys/versions.lock.json` 的 `schema_version: 1` 只标记**发布锁文件自身**的格式,不进入 SaaS↔Dispatcher/Agent 的业务消息;该锁的旧日期是基础设施制品版本,不能作为当前代码或生产批准的证明。 | +| `contracts.ReadCurrent`、`contract.ValidateCurrent` 与 `internal/contract/current.go`、`SessionRegistry.CurrentMeta` | 分别是**严格的当前合同选择/校验**和**最新未过期会话读取**,没有 `ReadOld`/`ValidateOld` 或旧 Agent 业务入口。`scripts/check-current-*` 与 `contracts/current*_test.go` 中的 `current` 同义,指唯一当前校验目标。 | +| `contracts/upstream/v1`、原版计划/提案、旧 AGENTS、旧本地合同与旧部署样例、历史证据中的旧文件路径 | 带来源和 hash 的历史事实或负例,保存在原锁定来源或 `docs/archive/`,不作为现行配置、兼容输入、真实供应商签收或自动数据迁移。历史证据仍保留**当时**的原路径,由归档 README 标明现位置;不为消灭字符串伪造旧来源。两份使用者修改的旧第三方文档继续受保护。 | + +本地验证入口:`make check`(格式、合同/Proto、`go vet ./...`、`go test -race ./...`、构建及上述三项实际隔离 MQ 集成测试)、`make release-check-local`(本地包/当前来源 hash/Mock-only/不覆盖旧文件)。P08 尚需逐项 A01–A12/K01–K16、业务覆盖率 ≥65%、故障重启与约十分钟 Agent 会话续期和真实诊断门禁的可执行证据;非生产主机的 capture-first 检查与外部签收**均未执行**。 diff --git a/docs/plan-saas-dispatcher.md b/docs/plan-saas-dispatcher.md index e0aa223..e65b8a9 100644 --- a/docs/plan-saas-dispatcher.md +++ b/docs/plan-saas-dispatcher.md @@ -19,7 +19,7 @@ | P04 MQ/SQLite | SaaS 预建队列、独立 Dispatcher 身份、持久 inbox/outbox、控制屏障及共享结果队列有隔离 MQ 测试。Confirm 不等于 SaaS 已处理。 | | P05 AI/媒体 | 不可变获批 AI 快照,ASR-only、ASR+LLM+TTS、关键词、16 kHz 媒体及失败边界仅经本地 Mock 验证。 | | P06 录音/OSS/结果 | 隔离双向 TLS 录音、一次 HTTPS PUT、失败与未知结果恢复、48 小时边界和唯一最终 MQ 结果经本机测试。 | -| P07 唯一当前入口 | 旧执行/配置/MQ/AI/Proto/Schema/脚本路径已分批删除;当前文档和全仓残留例外审计进行中,历史来源及实际数据保留。 | +| P07 唯一当前入口 | **项目内已核查**:旧执行/配置/MQ/AI/Proto/Schema/脚本路径已分批清除或逐字节归档,当前文档/引用/hash 及合法历史例外逐项核对,实际数据保留;详见 [`evidence/saas-dispatcher-p07-audit.md`](evidence/saas-dispatcher-p07-audit.md)。真实外部兼容与主机诊断不在此项签收内。 | | P08 验收交付 | A01–A12、K01–K16、业务覆盖率 ≥65%、重启/故障矩阵及诊断门禁的最终对照**尚未完成**。不得将前述分批通过写为最终签收。 | 每批变更、测试命令、正反例和未验证项详见 [`evidence/saas-dispatcher-implementation.md`](evidence/saas-dispatcher-implementation.md)。发布包 `production_approval=false`;`make check`、`make release-check-local` 仅检验本机隔离制品与行为,不运行真实服务。