Files
go-sip/AGENTS.md
T

63 KiB
Raw Blame History

go-sip:独立项目约束

宪法

  • 任何涉及文件的调研或修改,如果当前是 git 仓库,需要先同步远程提交到本地,避免调研过时问题。

  • SaaS↔Dispatcher 最终契约唯一来源为 git@gitee.com:zzmbac/sip-contracts.git,本项目只通过 contracts/schema Git submodule 引用,不再维护 contracts/local 或独立 Schema 副本。每次调研或修改契约前必须执行 make contracts-update 获取并快进到共享仓库最新 main,失败即停止,不覆盖现存修改、不回退旧文件。所有契约变更必须同步修改本项目的 submodule 指针、实现、测试及相关文档,并通知 SaaS 开发人员;共享仓库单独提交不算完成。普通构建只使用固定提交,不自动联网追新。流程见 docs/contracts.md。

  • 基于 TDD 进行功能的开发与业务变更,单元测试覆盖率要保证 65% 以上

  • 任何时候我提出任何需求均需要理解并结构化复述后与我进行确认,避免理解偏差。

  • 不要在代码里藏兜底逻辑来吞掉错误、隐藏问题。出了问题就应该让它爆出来,否则你永远找不到真实问题。

  • 当一个问题出现时,不要用各种 small fix、针对性补丁来掩盖它。必须定位真实根因,彻底修复。在 bug 上糊纸只会让系统积累你不知道的危险暗病。

  • 即使问题很难定位,也绝不要偷懒做表面修复。应该给项目增加充分的日志和可观测性,保证下次问题再现时你有足够信息去定位。问题无法修复时,只需要诚实告诉我信息不足、需新增日志,不要假装修好了。

  • 始终注意在关键路径上给自己留足排查日志,确保每一个关键节点都是可追溯的。

  • 当项目关键技术栈或产品方向发生变更时,同步更新 agents.md。文档必须随代码一起演进,不能让它变成过时的谎言。

  • 大规模重构或实验性改动前,必须先切新分支。

  • 不以维护向后兼容性为目标。对于已经废弃的代码路径,应直接移除,不再通过兼容层、回退机制或迁移方案予以保留。

  • 在充分满足当前需求的前提下,采用尽可能简单的实现方案。避免引入缺乏实际需求依据的抽象、配置项和间接层。

  • 采用渐进式、分层的方式构建系统。首先完成能够端到端运行的最小版本,再基于稳定可用的产品逐步增加功能。不要以尚未成熟的复杂性取代已经可用的产品。

  • 保持组件的模块化,并明确划分不同职责与关注点。

  • 当成熟且维护良好的库能够降低整体复杂度或提高可靠性时,应优先采用。除非有明确理由,不要重复实现通用功能。

  • git.ipao.vip/rogee/doubao-speech-go 是我们自行维护的独立 SDK,不是火山官方包。仓库为 git@git.ipao.vip:rogee/doubao-speech-go.git,本地工作区为 /home/rogee/Workspace/doubao-speech-go。发现包的问题,应定位 SDK 内真实根因,直接在该仓库修改并补测试,发布后更新本项目的固定依赖版本;不得为了包的缺陷在业务代码里增加兼容层、绕过或静默兜底。本项目只引用固定版本,不内置重复源码或长期使用本地 replace。

  • 在自行实现功能或新增依赖之前,应优先评估项目现有依赖的能力。应先查阅相关文档和类型定义,不应未经确认就认定某个库不具备所需能力。

  • 架构决策应着眼于长期演进。不要采用仅能解决当前问题、且预期需要在后续替换的权宜方案。

  • 在设计解决方案之前,先研究成熟产品如何解决同类问题。优先采用经过验证的模式和约定,避免从零开始另行设计一套方案。

禁止清单(不主动考虑、不主动提议、不实现,遇到只记入 TODO 技术债列表)

  1. 法律合规:商业库授权、开源协议合规、GDPR/个保、隐私政策(法务负责)。
  2. 依赖安全:NPM 及第三方包漏洞、安全补丁、依赖升级策略。
  3. 访问安全:服务只需支持局域网访问(host 绑定 0.0.0.0 即可),不考虑公网暴露、HTTPS、认证/权限体系(登录、RBAC)、限流、防爬、数据加密、审计日志。

红线清单(快速阶段也不能省,现在便宜、以后极贵)

  1. 数据模型/表结构:认真设计,建表慎重——改表成本远高于写代码。
  2. 目录结构与模块边界:保持简单清晰,不堆一坨代码。
  3. 基础错误日志:出错时至少能看到发生了什么。
  4. Git:小步提交,保持历史清晰。
  5. 基础输入校验:仅防止程序崩溃,不做安全加固。
  6. 环境差异配置(端口、地址等)与代码分离(.env 或配置项)。

沟通方式

  • 向使用者回报时,使用清楚直白的语言说明做了什么、结果如何。最终回复禁用术语、技术实现细节与工程腔。写法是:对一个聪明但没在看代码的人解释。

  • 实际执行过程(思考、规划、写程序、除错、解决问题)保持完整的技术严谨度,这条规范只适用于对使用者的沟通方式。

回复风格

  • 只写结论、实际改动、原因、验证结果
  • 不描述推进动作,禁用「我先……再……」等叙述句式
  • 不使用工程汇报腔(「落地」「落到」「推进」等类似用语)
  • 直接、专业、去表演化
  • 回复文字永远使用与对方相同的语系,专有名词维持英文
  • 不使用口语化表达,说重点,简单明了
  • 需要时搭配条列式与表格加强输出可读性

决策规则

  • 当方案有多个选项时,列出每个选项的优缺点,并明确指出推荐选项与原因,先问我。
  • 有多种实现方式时,选最简单能跑通的。
  • 遇到"禁止清单"中的问题:不展开、不实现,追加到 TODO 技术债列表即可。

Sub-Agent 使用时机

当任务符合以下任一条件时,直接 spawn sub-agent 分工执行,无需询问使用者:

  • 任务可拆分为多个平行且无依赖的子任务

  • 各子任务职责明确分离,合并执行会造成 context 混杂

  • 大量结构相同的重复性任务(可用 spawn_agents_on_csv batch 执行)

  • 各子任务需要不同的 model 配置或 sandbox 权限,例如:

    • 探索型任务使用轻量 model + read-only sandbox
    • 审查型任务使用高推理 model + read-only sandbox
    • 修改型任务使用执行导向 model + workspace-write sandbox

验证标准

开始任务前先定义完成标准。交付前依此验证,发现问题就修好再测,不把未完成的工作交回给使用者。只有确认完成,或遇到真正需要使用者介入的障碍时,才回报。

当前范围与权威入口

  • 2026-10-10 SaaS 就绪延期授权:此次任务回执更新部署中,真实任务接口 HTTP 200 返回 code=500 错误正文而非任务列表;使用者明确批准暂不等待 SaaS 修复、继续部署。新增显式 deploy --defer-saas-readiness,只延期已通过 MQ 独立登录/关闭、HTTP 200 合同验证失败的 SaaS 就绪检查,默认关闭;不修改运行 Schema、不启用旧配置、Mock 或业务准入。探测保留安全路径/原因与延期标记,Dispatcher 必须实际 auto-restart 且最新错误确认为 SaaS 配置校验,不能把 failed、数据库/证书/未知故障算完成。业务始终标记未 ready,原生 Asterisk、数据、真实呼叫授权与 Debug/Capture 边界不变。规则见 deploys/production/README.md。

  • 2026-10-10 任务控制回执恢复:共享合同 e750fe4 已推送,项目合并提交 60fe840 已进入 main。成功回执必须携带任务编号、动作、处理结果、原因代码和实际任务状态;结构拒绝仍逐字段返回有效身份与动作,不因整条 Schema 失败丢失有效字段,未知字段省略、不填 null,不信请求自带状态。状态读取故障须显式报错;补齐字段后的出站回执仍禁止作为入站命令执行。根因修复测试日志缓冲的并发读写在 7357eae,不改业务日志行为。完整检查、实际隔离 MQ/HTTPS/mTLS、72.6% 覆盖率及 Python21通过。使用者已批准 main 推送后的固定环境普通重部署,保持 Debug 开启、Capture 关闭,不 reset、不重启 Asterisk、不主动投递/试拨;现场事实以 .local/task-control-deployment/ 的受控记录为准,不以本地通过代签 SaaS 收到或生产。合同与本地证据见 docs/evidence/task-control-receipt-fields-20261010.md。

  • 2026-10-10 07:40 全部改动 main Debug 部署:使用者明确包含业务提交 09e273b,合并提交 a2cafd419b56a2ddf60322b813b4e22f2d62a6b9 已推送并安装;共享合同 8e6c332 经 contracts-update 核验,保留全部最新日志隐私修复与新增拒绝反馈/SIP 来源快照。冲突解决保留实际收件/确认日志、持久拒绝与拒绝身份幂等;新增两模式合并回归先红后绿。完整检查/固定提交发布检查/Python21通过,业务覆盖率72.6%。Agent2904634/D2904645 enabled+active/running、0重启、Debug开启/Capture关闭;实际SHA256 bf81d096a46ddecede59329afa0fbae12aadd74bb919fc6ae9fc4d139a7d1a1e 经相同部署构建独立复现,Asterisk777461不变、通道/tcpdump0;实际14HTTP/各8RPC安全日志核验。无reset/旧库迁移/Asterisk重启/抓包/试拨/主动消息/额外AI OSS。无效MQ/拒绝反馈实际SaaS接收、通话和生产仍未验证,原独立probe saas_pending/business_ready=false/real_reboot_verified=false保留。权威为干净隔离main,根工作区旧日志及并行内容不覆盖或清理;见 docs/evidence/all-changes-main-debug-deployment-20261010.md。

  • 当前日志与抓包规则:Dispatcher、Agent 的 --debug/-D 仅开启 Logrus 详细收发日志;普通模式记录自身关键工作流程、方向、身份、结果、耗时及错误。HTTP/MQ/RPC 正文只在 Debug 中记录安全副本,禁止密钥、Token、签名 URL、完整提示词/对话/音频及原始 SIP;不截断其余可读业务 JSON,不修改发送数据、不吞错误。Agent 原 --debug 抓包含义移除,逐通外部抓包凭证检查改为独立 --capture,不足时仍失败关闭。独立 sip-call 的 Debug 抓包参数不变。详细规则见 docs/logging.md。

  • 2026-10-10 06:29 Logrus内嵌二进制最终现场:第十一次审查的audio/src data URI在 64bd48b 根因修复,共享入口/Markup属性/JSON form自由文本附件仅投影标准MIME和实际解码字节数,不输出payload;坏声明编码显式invalid_data_uri/未知长度,敏感元素同样拥有属性内容,仅类型校验诊断/二进制元数据保留且重复格式化稳定。用现有media编码完整非空1644字节WAV/800采样、四URI形态×两模式×实际HTTP HTML/text/JSON/form与标量先红后绿,传输bytes相等,坏编码/属性私密内容/伪元数据回归;前十轮保持。最终完整检查/发布检查/Python21通过,业务覆盖率72.3%。Agent2904184/D2904196实际SHA256 e4b1f3edbfe0053f908e7f9093edb343133b9de24b9ca78da0cfd37287f223aa,enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP/各8RPC实际安全正文核验;现场无内嵌音频/form/非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威源码/最终证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 05:51 Logrus URL scheme最终现场:第十次审查的大写HTTPS签名URL在 cd3fe5d 根因修复,共享urlInText按标准忽略HTTP/HTTPS/WS/WSS scheme大小写,不做签名参数或主机特判;无认证/query/fragment的普通URL原值保留。十二大小写×两模式×实际HTTP text/JSON与error/detail/message先失败后通过,签名query排除/真实诊断保留/原bytes相等,前九轮回归保持。最终完整检查/发布检查/Python21通过,业务覆盖率72.2%。Agent2903856/D2903867两实际SHA256 971a5f674ad1d75a08f6023ce962f181212e34913b2d0ac1d8f250d138c6b0b8,enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP/各8RPC实际安全正文核验,现场URL检查同样忽略scheme大小写;无现场新signed URL/form/非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威源码/最终证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 05:27 Logrus 单字段表单最终现场:第九次审查的单字段URL编码敏感字段在 1202b9a 根因修复:一对/多对字段统一解码分类,不要求&,接入cleanString覆盖两模式标量;bare flag是空值字段,坏key/value独立INVALID_FORM标记,不回原正文或撤销此前脱敏。七形态×两模式真实HTTP/标量先失败后通过,原请求响应bytes完全相等、诊断保留;前八轮回归保持。最终完整检查/发布检查/Python21通过,业务覆盖率72.2%。Agent2903610/D2903622两实际SHA256 1fcb84b17d6459c592021e224b4b5e622fcfde115f8a74f334c07261193f24f8,enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP/各8RPC实际安全正文核验;无现场form/非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威源码/最终证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 04:53 Logrus 引号标签最终现场:第八次审查的带引号内容标签在 a66e111 根因修复:引号/非引号标签与诊断投影共用词法器和字段名解码归一化;JSON Unicode转义经标准解码,非法引号字段尾部保持隐藏;完整嵌入JSON交既有结构脱敏,不吞相邻诊断。八种引号/转义形态×两模式error/detail/message/HTTP先失败后通过,授权JSON诊断保留及前七轮回归保持。最终完整检查/发布检查/Python21通过、业务覆盖率72.1%。Agent2903352/D2903363两实际SHA256 24404b7f5e0bc41d12887fcd54a5128bf36b62bda7ce3a8888fc0e3807578b84,enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP/各8RPC实际安全正文核验;无现场非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威最终源码/证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 04:08 Logrus 内容持续归属最终现场:第七次审查的role/message、human和任意对话字段误解除保护在 01b2f82 根因修复。不补说话者名单;自由文本内容标签拥有未分界后续文本,只逐行保留类型已校验的诊断数值/UUID/时间戳/已知状态,诊断行不释放后续归属,未知/嵌套/伪状态仍隐藏。结构化正文外部业务字段继续按结构保留。七种消息形态×四内容标签×两模式/多路径先失败后通过,真实>150KB HTTP原bytes不改及明确非内容长业务段不截断通过;最终完整检查/发布检查/Python21通过,业务覆盖率72.0%。Agent2903064/D2903075两实际SHA256 d74078bae03c0044967de8b7cad61e92cbaf694339520cdfd5b6bc6556411036,enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP/各8RPC安全正文再核验;现场无非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威源码/最终证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 03:04 Logrus 行中内容标签最终现场:第六次审查的错误前缀内容标签在 bfe7630 根因修复:字段归属由行中敏感标签建立,保留其前失败原因,后续对话仍跨段落隐藏,唯一分类不变。四种错误前缀×六种内容标签×普通/Debug error/detail/message/HTTP反例先失败后通过。最终完整检查/发布检查/Python21通过、业务覆盖率72.0%;两实际SHA256 c29200e39e8274aa5a806eaa0037fe878712829864ee2f58d9707c9d25682ff9,Agent2902748/D2902759 enabled+active/running、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。14HTTP、两端各12RPC安全正文验证,无现场非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/投递/额外AI OSS。权威固定源码/最终证据仍 .local/logging-isolated main,根并行修改保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 02:16 Logrus 唯一内容分类最终现场:第五次审查的conversation/history和JSON数组分类偏离在 2683d98 根因修复:唯一内容分类同时供sensitive、标量/文本续行、Markup、JSON使用,移除另一份别名表。16种内容字段×两模式×error/detail/message/HTTP text+JSON及错误JSON数组反例先失败后通过,业务原因与标识保留。最终完整检查/发布检查/Python21通过、业务覆盖率72.0%。两实际SHA256 2f834e0cf4d1e94d264d47050c60b7462ee4f573b040633c0e3b6ef420a705cc,Agent2902409/D2902421 enabled+active、0重启、Debug无Capture;Asterisk777461不变、通道/tcpdump0。实际HTTP/RPC安全日志再次核验,现场无非JSON/MQ业务/呼叫/真实恢复故障,不代签这些或生产;无reset/迁移/抓包/主动投递/额外AI OSS。源码/最终证据仍 .local/logging-isolated main,根并行改动保留;见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 01:54 Logrus 对话跨空行最终现场:第四次审查的空行终止对话归属已在 b093f4d 根因修复;对话标签及后续内容跨空白段落/CRLF仍受保护,仅明确非对话业务字段结束。新增多标签/四种空行/两模式scalar与HTTP、真实长HTTP夹入对话且bytes不变反例先失败后通过。最终完整检查/发布检查/Python21通过、业务覆盖率72.0%;两真实SHA256 06592d03b7e754d24c70f352d6ab2aa224761a704a8516029dd9d684086c8745,Agent2902174/D2902186 enabled+active、0重启、Debug无Capture,Asterisk777461不变、通道/tcpdump0。再次真实HTTP/RPC安全日志验证,未发生非JSON正文/MQ业务/通话/真实恢复故障,不代签这些或生产;未reset/迁移/抓包/投递/额外AI OSS。最终固定代码与证据仍 .local/logging-isolated main,根并行修改保留;详情见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 01:39 Logrus 对话字段统一保护最终现场:第三次审查的 textarea 与普通错误多行messages缺口已在 02e6ab9 根因修复:共享 cleanString 对 message/error/detail统一保护;敏感name的非void控件保护value及内容,void input不吞后续普通节点;仅对话字段保护续行,认证/凭据不隐藏其后正常诊断。新增断言先失败后通过。最终完整检查/发布检查/Python21通过、业务覆盖率72.0%;两个实际制品SHA256 296223c111a15dc48200c26548c4ffb7ec206736dbe389b6c107ef69c59181cd,Agent2901955/D2901966 enabled+active/running、0重启、Debug无Capture,Asterisk777461不变、零通道/tcpdump。真实HTTP/RPC安全正文再次验证,无MQ/呼叫/真实恢复/非JSON现场事件,未签收这些事实或生产;未reset/迁移/外呼投递/额外AI OSS。源码与最终证据仍隔离main .local/logging-isolated,根并行修改保留。完整证据见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 01:19 Logrus 自由文本最终修复现场:第二次审查指出 Basic/无标签 PEM 及非 JSON 正文缺口,已在 6ee95e4 修复并重验安装。自由文本认证头(Basic/Digest/Proxy)、无标签私钥 PEM 块均排除;Debug 保留可读 text/XML/form 原正文的安全副本,二进制仅类型长度,原收发 bytes 不改、不截断。新断言先失败后通过(长 text/plain、Markup/form、多行提示词、JSON 错误中认证不隐藏后续业务原因)。最终完整检查/发布检查/Python21通过,业务覆盖率72.0%。两实际 SHA-256为 38a1e553312ea7ffbff6e11ad9ececc99cb73b6dedb3339f03f55a71568f72b1,Agent2901719/Dispatcher2901731 enabled+active、0重启、Debug无Capture,Asterisk777461不变,零通道/tcpdump。14HTTP/两端RPC正文与敏感检查再验证通过;现场没有非JSON正文/MQ/通话/真实恢复故障,不伪造验证。仍固定nonprod-real,未reset/迁移/额外投递。最终源码为 .local/logging-isolated main,根并行改动保留;证据顶部最终版本见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-10 00:37 Logrus 最终固定版本:源码 fd37a67 已推送并安装;在完整阶段/原失败原因日志之外,补齐损坏结果 JSON 和文件 stat 的具体原因、私钥/Pem 与签名 WS/WSS 排除。新增断言先失败后通过,最终完整检查/发布检查、Python 21 测试通过,业务覆盖率 71.7%。两实际制品 SHA-256 7b606adf83147fdf966d455b6a2d3543955adcedca608b306f438dcbfcc424ad,Agent PID 2901612、Dispatcher 2901624,enabled+active/零重启、真实 --debug 无 --capture;Asterisk 777461 不变。14 次 HTTP/两端各 8 条 Debug RPC 正文、敏感字段/签名 URL 检查复核通过;现场无 MQ/呼叫/真实恢复故障,不代签这些事项。停止 D 关准入后复核零通话/未知执行再部署,未 reset/迁移或额外投递。隔离 main .local/logging-isolated 为最终源码基线,根工作区并行修改保留。证据见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-09 23:57 Logrus 最终排障日志部署:独立审查指出初版拒绝/等待及逐条恢复原因不足,已在 592c2fe 全面补齐已有关联身份、实际原因、各节点阶段、尝试/下次重试、未知及到期保留;失败原因不只记录类型,嵌入错误的 JSON 对象/数组也做结构化排除。新增断言先失败后通过,最终完整检查/发布检查与 Python 21 测试通过,业务覆盖率 71.7%。固定提交已推送、重部署,两业务服务 PID 2900896/2900908、enabled+active/零重启、真实 --debug 无抓包,制品 SHA-256 为 e3aa61d75768e6aca2b3567864890da4ba5bf3ebd53fba678cca242ae030a2b4。14 次 HTTP/两端 RPC 正文复核及敏感检查通过,仍无现场 MQ/呼叫/真实恢复故障,不以本地断言冒充;未清数据、改重试/数据规则或重启 Asterisk,PID 777461 不变。根工作区并行改动保留,权威源码在 .local/logging-isolated main。完整证据见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-09 23:16 Logrus 日志部署现场:日志源码 669f3a5 已推送并安装到登记测试机,两固定业务服务均 enabled+active、进程稳定且零重启,实际启用 --debug、不启用 --capture。现场确认 14 次 SaaS HTTP 请求/响应及两端实际 RPC 的详细日志,已观测正文敏感字段/签名 URL 检查零泄露;无实际 MQ 业务收发,须标记现场未验证。部署前先关 Dispatcher 准入再核对零通话/未确认执行;未清数据、重启 Asterisk、抓包、独立拨号或额外调用 AI/OSS。Asterisk PID 777461 不变。部署工具仍给出旧独立探测的 saas_pending/business_ready=false,不伪造成功,不以本次日志验证代签真实通话或生产。完整测试与发布检查通过、业务覆盖率 71.4%,原并行改动未覆盖或纳入日志提交。证据见 docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md。

  • 2026-10-09 17:24 最新参数规则与现场:使用者确认 params 重名键忽略、任务/session 字段优先;共享合同 f490afa、实现 ddd4de2 已推送并安装。真实 SaaS 任务 4 的原重复 voice 和 revision 1 未改,现已接纳;四个真实任务均暂停,Dispatcher 持久发现 ready、SIP 本地加载代次 17/pending=0。Agent/Dispatcher/Asterisk 均 enabled+active,D PID 稳定、零重启;未清数据、重启 Asterisk、独立拨号或主动投递。部署工具仍引用启动前独立 probe 的 tasks 阶段失败而显示 saas_pending/business_ready=false,具体 probe 原因未定位,不伪造成功,也不以标签否定实际业务启动事实;完整独立探测、真实通话/AI/OSS及生产验收仍不宣称完成。证据见 docs/evidence/ai-params-task-precedence-20261009.md。

  • 2026-10-09 最新固定环境事实:使用者确认修复正式 Dispatcher 的 SIP 加载遗漏并重部署;源码 b37d9f3 已推送、安装,Agent/Asterisk 的 revision 16、三条数字 ID endpoint/AOR/主叫/contact/UDP/PCMA 已从原生运行态逐条核对,Asterisk 未重启,零活动通话,未清数据、未独立拨号。Dispatcher 仍因真实 SaaS 任务 4(revision 1)同时包含 agent.tts.voice 与 agent.tts.params.voice 而退出重启;该失败是当时采用的冲突拒绝规则造成;随后使用者确认改为任务/session 字段优先、忽略 params 中重名键,共享合同已更新为 f490afa,SaaS 无需删除原有重复 voice。新规则部署及最新业务状态见 docs/evidence/ai-params-task-precedence-20261009.md;未完成现场核对前,不得把 SIP 加载成功或状态中的 saas_pending 标签当作全部配置/真实通话/生产签收。证据见 docs/evidence/dispatcher-sip-startup-load-20261009.md。

  • 当前正式部署目标授权(使用非正式配置,muzr4gzv-jzx8pg):先核验、合入 main 并推送,再完善一键部署脚本,在登记测试机 server.sip 使用根目录 saas.env、rabbitmq.env、aliyun-oss.env 和真实 SaaS 配置,以现有 nonprod-real 启动固定的 go-sip-agent.service、go-sip-dispatcher.service;原生 go-sip-asterisk.service 保留。配置固定在 ~/.config/go-sip/,业务数据固定在 ~/.local/share/go-sip/,制品在 ~/.local/opt/go-sip/releases/,不再用每次试验的新业务目录或 Mock 代替正式部署验证。正式部署入口为 deploys/production/production.py;当前使用非正式配置,仍保留 nonprod-real、登记测试机及原有授权边界,命名不代表生产验收。下方日期记录是历史事实,其旧授权限制不覆盖本条新授权。

  • 本轮外呼授权:真实 SaaS 下发的全部获批外呼任务允许按正式规则执行,不再逐通询问;仍核对归属、号码、时段、额度、并发、有效授权与幂等,不自行生成外呼消息、不盲重拨或换线重拨。独立工具试拨及超出上述真实 SaaS 任务范围的操作仍需另行确认。没有任务或未接通时如实标记未验证,不以 Mock 代签真实通话或生产。

  • 部署与数据重置:普通重部署不清数据;仅显式 --reset-state 可处理本项目非生产数据。本次首次部署已获准,后续重置须再次确认;必须先停止相关服务、核实零活动通话、完成私密备份与清单,再重置,不把重置当成代码问题修复,不伪造旧通话终结或结果,不清外部 SaaS/MQ/OSS。清理限于两端确认退役的部署制品、临时文件及自有 Mock 设施;不得直接删仍用凭据、SSH 登记、原始证据、录音或恢复,不删除整个用户 ~/.local 或 Asterisk/其他项目依赖。退役数据按确认范围保留或备份后处理。SaaS 尚未启动不阻断部署:严格保留输入校验与关新准入,允许 Dispatcher 由 systemd 明确等待/重试,不用 Mock 或旧快照;SaaS/依赖业务队列/会话/SIP加载及通话验证延期,独立配置、MQ登录、证书或Asterisk故障仍须修复。2026-10-08 固定环境首次部署 e5f46ba 已完成:Asterisk/Agent enabled+active,Dispatcher enabled且因SaaS业务拓扑尚未供给而auto-restart,业务未ready。旧20个临时服务及自有本地RabbitMQ已私密归档退役;12份配置/证书0600,固定目录0700、linger已开启,但未实际重启验收。复核后5个旧unit drop-in目录/6份配置已私密归档移除,旧发布根目录原文件整体保留在go-sip-backups而非运行位置;证书/未知传输错误不归为SaaS等待,D须实际activating/auto-restart且有对应最新错误,failed不算完成。历史数据库/恢复事实保留于受控备份,不伪造旧终结;首次固定目录为空,已显式执行本次获批reset,之后普通重部署不reset。部署说明见 deploys/production/README.md,证据见 docs/evidence/fixed-preprod-systemd-20261008.md。

  • P01–P08 及 K01–K16 已完成项目内隔离 Mock 核验;本轮把分散的人类可读契约、文档与第三方对接合为唯一当前规范,不重审已确认规则。若未来另获启动开发/审查子 Agent 授权,必须按使用者指定的 gpt-5.6-luna、max 思考和 fast: true 逐项核验并显式配置,不静默换模型、降档或关闭 fast。

  • 唯一现行 SaaS↔Dispatcher 业务规范、Schema、拓扑和正常示例由共享仓库统一管理;现行合同只由 Git submodule 提交号固定,不维护重复逐文件或整包 hash;历史来源证据、验证脚本及错误示例放在 contracts/,不提交到共享仓库或嵌入运行契约。在本项目的共享入口为 contracts/schema/;docs/thirds/saas-dispatcher.md 只保留导航,不维护另一份规范。内部 Agent RPC 仍在 proto/agent/agent.proto。本地验收与外部缺口见 docs/evidence/saas-dispatcher-p08-acceptance.md。Markdown 不代替机器合同或外部签收,也不另外维护一份平行字段定义。

  • 已由当前合同来源清单固定哈希的历史提案与计划保留原字节于 docs/archive/sources/,使用者原有未提交的两份旧对接文档也按原字节归档;旧上游 v1 在 docs/archive/upstream/ 可离线校验,但不嵌入运行合同。旧 F/W 工作包、旧 MQ-only 合同及归档不作为当前运行入口。固定 MQ v1、HTTP /internal/v1/dispatcher/... 和业务 revision 是现行通信规则,不是自有实现代次;不得为历史路径新建兼容或回退。

  • 当前业务范围仍仅单节点、单 Dispatcher、单 Agent、单 Cell、单租户。根命令只接受显式 agent/dispatcher;mixed 和裸 real 仍拒绝;隔离 mock、只读 sip-only 和需主机核验/正式获批指令的 nonprod-real 为彼此独立的入口。2026-10-05 正式 SaaS Mock 已驱动真实 Agent/Asterisk 发出五通 SIP INVITE,均由线路返回 480,已证实终结并提交结果但均未接通、未见 LLM 应答;数企→15003164745 受当日 3/3 门禁限制尚未在修复版完成试拨,不能声称六组通过。2026-10-04 获批的同一数企/号码两次单次试拨操作均未观测到 SIP 包或最终结果,第二次已有 Dispatcher 派发回执而 Agent 错误根因未知。第二次派发回执经使用者授权后已私密持久化并确认 MQ,最终结果仍缺失;版本 d2c4a99 已通过来源/哈希、非呼出时段不拨号抓包预检与版本级只读主机核验并安装;SaaS、Dispatcher、Agent 在测试机已启动,但没有投递新呼叫,Asterisk 仍为零活动通话。SaaS 测试服务已从获批的新私有快照经 HTTPS 提供租户额度 2/revision 2;2026-10-04 旧事件 call-669f8829-a111-476d-88c7-3de604bf6dc6 经使用者单独确认,仅在原始 SQLite 备份、只读通道/抓包核实及操作者证据先私密落盘后,人工标记 Dispatcher inbox 为 finished 并释放占用(现为 0),Agent 原 unknown 幂等日记、派发回执及原始证据均保留;没有 Agent 签发终结事实或最终结果,不能据此声称真实呼叫成功。不得自动重拨、清理未知执行或以编译/本机 Mock 通过宣称真实通话可用。另有严格隔离的 --mode sip-only:只允许 Dispatcher 读完整 SIP、持久接纳归属 sip.config、经已激活双向 TLS Agent 会话将完整快照应用到原生 Asterisk,并从运行态核对版本;不发现任务、不启动业务呼叫、不开放准入、不处理其他业务控制。测试机已凭使用者批准,将三条历史登记地址以测试快照显式声明的 UDP/IP 鉴权、无需 REGISTER 配置写入并核对 Asterisk 运行态;供应商尚未确认这些实际线路是否满足上述参数,虽已观察到 SIP 480,但尚未证实线路可接通或完成生产签收。没有真实 SaaS、management、真实通话或生产签收;真实百炼 LLM 与 OSS 已各做一次不拨号、独立的最小连接/写入诊断(见 docs/evidence/real-ai-oss-one-shot-20261003.md),这不是获批任务的 ASR/LLM/TTS、录音和上传全链路签收。生产发布包仍为 production_approval=false。任何本机 Mock 或 SIP-only 核验均不授权真实呼叫。

  • 使用者批准独立的测试专用 deploys/test/saas-mock/ 仅模拟缺失的 SaaS:从 0600 的静态快照提供五类正式 HTTP 配置,在专用 RabbitMQ vhost 中由模拟 SaaS 预建现行拓扑;不在 Dispatcher 内注入快照;默认不发布外呼消息,只有受限脚本已为同一 event_id/线路/原始号码启动抓包后,才可显式单次 MQ 投递;不替代 Agent/Asterisk/AI/OSS。测试用正式入口必须同时具备只读配置、专用 MQ、真实 Agent/Asterisk/AI/录音/OSS、逐通确认和拨号前活跃抓包证据,缺一项不得试拨。此模拟不构成真实 SaaS 签收。

  • 开发按 TDD 分批,小步提交;不得覆盖使用者现存修改/未跟踪文件,不自动清理、迁移或覆盖任何现存 SQLite、spool、outbox 和 Agent 恢复文件。旧 .executions 及恢复根目录中旧 .uploads、.upload-locks、逐执行 state.json 的发现须只读失败关闭,现存未交付事实由使用者确认处置。真实云账号、EIP、线路、拨号、生产部署和共享数据操作分别需要明确授权。

  • 2026-10-08 使用者确认当前已完成改动合入 main 并推送,远端 31ebda9 核对成功后才进行数企独立 sip-call 单通 DEBUG 验证。仅 1 个 INVITE、原事务 100/183/200 与 ACK,原生确认接通;保持 3 秒后原通道两次读取确认 404、结果 connected/end_confirmed=true、原配置恢复、Agent 恢复 active、Dispatcher 仍停止。三线 ENV、NAT、旧数据库未改,无 AI/OSS、重拨或换线;原 PCAP 未捕获 BYE/RTP,不能宣称对端 BYE 回执、媒体/声音或 ASR/LLM/TTS 全链路通过。此事实不解除中鼎新地址无回复、静态 transport 公网地址缺项及旧 SQLite 布局拒绝的独立阻断;见 docs/evidence/shuqi-sip-call-after-main-push-20261008.md。

  • 2026-10-08 使用者指定中鼎改为 222.186.130.228:5060、主叫保持 mbkq,ENV 与 SaaS 测试 SIP revision 15 已更新,其余两线未变;源码 310a14f 的 Agent/Dispatcher 与 sip-call 已部署。获批独立工具 DEBUG 只实际发出一通:1 个 INVITE transaction、6 包(5 次协议重传),0 SIP 回复、未接通;原 unknown 结果保留,后续精确原通道 404 的操作者证据先私密落盘后才恢复本通原始配置,未改写为正式终结结果。Agent active、Dispatcher 保持原来 inactive、Asterisk 未重启。新版拒绝旧 SQLite 6 表/version 2,使用者未批准替代运行目录,不能自动迁移、清理或以新空库绕过;恢复后的业务中鼎 AOR 仍为旧地址,不能把工具临时加载等同于持久业务配置生效。DEBUG 还确认 transport 未设外部信令/媒体地址、报文公布私网地址,但旧中鼎抓包在同样设置下仍返回 480,不能把此次无回复唯一归因于 NAT 或断言供应商故障;未修改静态 transport、重启 Asterisk或重复盲拨。现场与回归边界见 docs/evidence/zhongding-new-ip-sip-call-debug-20261008.md。

  • 2026-10-08 使用者批准独立测试工具 cmd/sip-call:单独编译,以 sip-call [-D|--debug] <线路.env> <原始号码> 自动加载固定 ENV、临时配置并核对原生 Asterisk,仅拨一通,不接 SaaS/MQ/AI/OSS,不重拨、不换线;业务 Agent/其他 ARI 应用须停止,活动通话或旧测试配置阻断执行。仅 --debug/-D 才使用 tcpdump/tshark 收集本通证据;不带参数只报告原生通道事实,不编造 SIP/媒体/抓包事实。sip-go-agent agent 同样增加 --debug/-D,默认不依赖外部 tcpdump/抓包凭证;调试复用现有抓证脚本并在拨号前严格核对活跃凭证,不能静默降级。HEP 真实 SIP 响应、业务授权、时段、额度及未知执行保留规则不变。开发核验已完成;2026-10-08 经使用者另行确认,独立工具及按当前表生成的三份 0600 ENV 已部署到登记测试机 rogee 用户的 ~/sip-call/,未更新业务 Agent/Dispatcher、未加载或改动既有 Asterisk 线路、未拨号或调用 AI。默认运行不调用抓包工具;使用者进一步要求生产和测试安装环境均统一预装 tcpdump/tshark,不按环境跳过,但抓包仍须显式 --debug/-D,不足时不能静默降级。登记测试机现已安装并核对 tcpdump 4.99.5、TShark 4.4.19 的 SIP/RTP 解析能力;未开启抓包或更改抓包权限,不能把工具安装当作逐通抓证、线路接通或生产签收。部署来源、文件 hash 和只读主机事实见 docs/evidence/sip-call-test-deployment-20261008.md。独立工具不属于生产发布制品,也不授权真实试拨。

  • 2026-10-09 使用者批准修复独立 sip-call 的 sudo 归属问题:先将测试机 pjsip.conf 恢复为 rogee:rogee、保留 0600 与原字节,再本地修复工具。主程序必须以配置所属用户运行,写入/抓包前拒绝 root 或归属不匹配;临时与恢复配置保留原用户/组及权限,恢复检查不得只看测试 endpoint 消失。另获明确批准,仅为测试机 /usr/bin/tcpdump 配置 cap_net_raw,cap_net_admin=eip,已用 rogee 验证启动与 SIGINT 停止,输出丢弃、零包、未生成流量;不对主程序提权,不用 sudo 整条命令。调试启动失败须区分“已请求但未启动”和默认“未启用”。归属修复阶段未部署新版工具、未重启服务、未拨号;随后使用者明确仅批准独立工具部署与版本/帮助检查,已将源码基线 4b27ef3 及本地 Go 差异固定的工具安装至 /home/rogee/.local/bin/sip-call,SHA-256 为 c6999f84692e31704915450151f9c6c1a31b3e5920acc58a1d3164aafb0941ba,原工具与来源清单私密保存在 ~/sip-call/tool-backups/20261009T021242Z-c6999f84692e/;帮助命令通过,原配置和 ENV 未变。此次不启动抓包、不执行 tcpdump→TShark 联合自检、不重启服务、不拨号;此前普通用户中鼎等待接通超时的线路/网络/程序根因仍未证实。详见 docs/evidence/sip-call-ownership-repair-20261009.md。

  • 2026-10-09 使用者确认独立 sip-call 改为 sip-call [-D|--debug] <线路.env> <原始号码>,直接移除 call/--sip 旧写法。临时线路改用主机预先配置且仅配置一次的 #tryinclude sip-call-managed.conf:工具只创建本次独立线路文件,确认通话结束及零活动通道后删除、reload 并核对 endpoint/AOR 已卸载;原 pjsip.conf 和业务线路不写入、不备份,输入 ENV 保留。入口缺失/重复、旧临时文件或配置变化明确拒绝;未知通道仍保留临时配置与证据,不自动删除。tool-backups 是安装时保存的旧工具及来源记录,非 SIP 配置备份,不自动删除。此前本地阶段未部署;随后使用者批准先提交 push 再部署、不外呼。源码 6e028d4 已推送核对,新工具已安装至登记测试机 /home/rogee/.local/bin/sip-call,SHA-256 为 428361822621597ca26e70281d65f4c815251a02d47c11794c1519828f03438a,固定入口已一次性追加并核对原字节前缀/归属/权限。ENV、业务线路与服务状态/进程号不变,零活动通话;未加载临时线路、reload、重启、抓包、外呼或调用 AI。原工作区并行产生的合同指针/测试改动未覆盖或纳入本次提交;制品来自干净固定提交。来源及验证边界见 docs/evidence/sip-call-positional-cli-deployment-20261009.md。

SaaS、Dispatcher 与 Agent 的现行边界

  • 2026-10-09 使用者确认保留 SaaS 的 revision 字段与现行 Schema,仅移除外部修订号的强接纳检查:收到队列事件后重读并采用完整当前配置,不因任务/额度修订号不增长、降低或同号内容变化拒绝。启动时列表与随后详情的来源修订号/状态变化采用详情,持久 pause/stop 不被 HTTP running 清除;同租户未来呼叫绑定最新额度,已接纳执行和未知占用保留。选线到占用之间比较实际业务配置摘要(不含 task_revision/status),内部 SIP 加载代次、归属、幂等及原生加载核验不变。共享规范仅调整文字、不改 Schema;SaaS 开发须同步理解,不再要求状态变化递增修订号。本次获准本地 Chrome/browser-harness 操作租户任务与管理员线路页面、提交推送及无重置部署,并仅通过专用测试任务导入已核对平台白名单的号码;最多两次单号码导入/两通外呼,前通确认结束后才可下一通,白名单不可核对或结果未知即停止。原线路地址/主叫/鉴权、白名单与现存数据不得改变,不生成 MQ 外呼或做 500 通压力测试。

  • SaaS→Dispatcher 的五类只读配置为 GET /internal/v1/dispatcher/sip、/task/:task_id、/tasks、/tenant/:tenant_id/quota、/ai-providers;路径前缀固定,均须校验 Dispatcher UUID/资源归属、数字 tenant_id、完整快照、来源、有效授权和版本。配置读失败、过期、矛盾或不确定时关新准入;没有旧 MQ 配置回退、通用业务 HTTP、ETag 兜底或偷偷启用旧执行字段。已接纳任务持久绑定原快照。

  • 呼叫、控制、必要回执和每通话唯一最终结果经固定 v1 RabbitMQ Topic/队列,任务与控制队列由 SaaS 预建,Dispatcher 不可自行建/删/绑定;stop 时先停该任务消费者并关闭持久准入,再 purge 仅该任务队列的待投递消息,失败不回成功;SaaS 停止继续投递已 stop 任务,后续误投递不执行。结果进入指定共享 durable 队列。独立 D UUID 和接收队列不能广播后正文过滤;tenant_key 原值保留,任务只能由归属 D 执行。入站先校验和持久 inbox 后 ACK,状态/outbox 同事务;persistent、mandatory、无 return、publisher confirm 成功才记交付,confirm 不是 SaaS 应用收讫。失败/确认丢失与重启只重发同身份消息,不重复拨号或捏造结果。

  • call.execute 只带获批 task_id/callee,调用线路、AI 和时限由该任务快照固定;主叫由绑定线路的 SIP 快照唯一 caller_id 决定,不再由任务挑选主叫档案;task.control 的 start/pause/resume/stop/edit 无旧 CAS/版本字段,控制回 task/action/status 处理结果,stop 不可恢复。任务启动/重启完整读取一次列表,运行中不定时轮询任务列表或任务配置;新建任务由 start 读取任务配置和租户额度,resume 重读并解除人工暂停,edit 只重读、校验并持久更新已有任务的配置和额度,不改变人工暂停/停止状态、不向 Agent 发动作,也不影响已发出的通话快照;停止后的 edit 拒绝;外部修订号接纳规则以 2026-10-09 的更新为准。全局 AI 服务商列表每次启动只读取一次,本进程全部任务复用,变更须重启后才生效。启动时全量读取并核验 SIP,运行中只由 sip.config 通知触发全量 SIP 读取,无常规定时 SIP 轮询;任务 start/resume/edit 使用已生效 SIP 快照,不自行拉取或向 Agent 核验 SIP。SIP 修订变化待旧呼叫结束且 Agent 已加载后,仅在本地重新绑定任务快照,不重读任务列表;待处理期间新准入关闭。发现分页同快照先全部校验后提交,MQ 控制持久状态高于偶发 HTTP 状态;冲突关准入、resume 须重新核验。历史命令不因消息年龄过期,但实际呼出前仍检查任务归属/事件号码格式/时段/授权/额度和有效通话上限;任务结束不删未确认结果、恢复、幂等或未知占用。

  • 独立 Dispatcher 的 SQLite 是任务、额度、inbox/outbox 的权威数据;Agent 无业务数据库,录音、执行与上传恢复只写受控私有文件。额度包含未知占用,新 boot/租约到期不得自动清除未知执行;明确 Agent 在拨号前拒绝时须持久拒绝并释放,已接纳但证实 ARI originate 从未提交的失败由原 Agent 经正式终结回执释放,RPC 交付未知时仍占用。2026-10-04 修复版 d2c4a99 已安装并通过非呼出时段主机诊断,新隔离测试租户额度 2/revision 2 已启用并由 Dispatcher 只读拉取;原快照保留;该条旧执行仅按前述经使用者授权的人工核实记录解除 Dispatcher 占用,绝非新 boot 或超时自动清除未知执行。仅 Agent 用机器可读标记证实本次未发起的拒绝可自动释放;旧执行的同错误码不算证明。不实现双活数据库、自动跨机热备、多 D 共享额度或第二租户公平。本轮不借本机 D1/D2 隔离夹具宣称多 D 运行。不得建立旧表/旧消息/旧 HTTP 执行兼容通道。

  • Dispatcher↔Agent 复用 Unary gRPC 和受控 Endpoint;Agent 预绑定 D UUID 与服务端证书指纹,激活/会话代际、peer mTLS/SAN/SNI 和已签发期限须核对,新 boot 不清未知占用。Agent 不自行向 SaaS 取任务/AI/OSS 授权;Dispatcher 只用已经核验的 Agent GetLoadedSIP revision 开执行准入。本机 Mock 的加载回报不证明 Asterisk 已实际加载;真实 Agent(nonprod-real 与隔离 sip-only)在配置原子写入、PJSIP reload 和运行态 endpoint/AOR/UDP transport 一致后持久标记 revision,每次加载查询重新核验。正式业务 Dispatcher 在启动及 SIP 更新时必须通过现有 Agent 会话加载获批快照后再核对版本,不得漏接加载步骤;旧通话与未知占用保留、排空前关新准入。隔离 Mock 仍只核对预加载夹具,不发起原生 SIP reload。只支持明确的 UDP、IP/none 鉴权、无需 REGISTER 的 IPv4/PCMA 线路;未知字段和其他传输/鉴权/注册方式拒绝,不热更静态 transport。每条 SIP trunk 只允许一个原值 caller_id,Agent 把该值同时配置为 Asterisk endpoint 的 from_user 和 callerid,并在 GetLoadedSIP 前核对实际运行值;旧任务 caller_profile_id 与线路 caller_profiles 必须直接拒绝,不保留兼容路径。SIP 配置的唯一编辑/审批面仍是 management。

  • 非生产真实 Agent 的 Asterisk res_hep/res_hep_pjsip 仅镜像至本机 UDP:在 ARI Dial 前读取本次 SIP Call-ID 并绑定执行,按 Call-ID 和原始 INVITE transaction 只采集真实最终响应的状态码、状态行与完整 raw;丢失/无法关联以 sip_capture_error 显式报告,不从 ARI、号码或挂断原因推测。镜像缺失不阻止已证实终结的额度释放;未经确认的占用仍保留。配置及回滚见 deploys/cell/README.md,不得将完整 SIP 报文写入普通日志、提交或聊天;本地测试通过不等于测试机已部署 HEP 或真实接通。

  • 2026-10-08 用户批准本地配置规则调整及新模型调用支持:SaaS SIP revision 可省略,完整读取覆盖旧配置;transport/auth_mode 判定忽略大小写,但不补其它缺失线路参数。Dispatcher 持久分配内部 SIP 加载代次并核对 Agent/Asterisk,旧通话排空与未知占用保留规则不变。任务列表仅忽略 schema_version/control_seq。任务用唯一的 provider_ref 对应连接的 provider_code,provider_id 仅为连接记录标识;一份连接可供多用途复用;任务决定厂商/模型/ASR–LLM–TTS 用途,provider 只提供连接信息,不要求 role/adapter/enabled,未知供应商/协议及不可表达的连接参数显式拒绝。2026-10-08 追加用户确认:移除精确型号/音色业务硬编码;同协议模型及可表达参数从任务取得。当前 TTS 固定使用 task-based WebSocket,不按 model 名或地址猜协议、不失败回退 HTTP。模型实际可用性由供应商调用返回事实决定,不以本地模拟代签。新增本地调用代码及模拟测试不授权部署、拨号或真实 AI 请求。SQLite 当前布局因新增持久 SIP 快照变为 3;旧布局只读拒绝,不自动迁移或改写旧文件。

  • 2026-10-08 用户确认按共享合同 b502ad2 本地适配任务线路并发:allowed_trunk_ids 只接受包含 trunk_id/concurrency 的对象数组,重复线路拒绝;非负整数 concurrency 的 0 表示该任务不使用该线路。选线及 SQLite 原子占用同时遵守租户、任务总量、线路总量、任务在线路上的上限,未知执行不释放;选线后的业务配置变化拒绝原选择;2026-10-09 起以实际配置摘要而非外部任务修订号判断,来源修订号/状态元数据变化不单独拒绝。占用仍由现有 inbox 与冻结任务快照确定,不新增业务表、不转换旧快照或迁移旧库。ASR/TTS 使用连接的 ws_endpoint,LLM 使用 api_endpoint,缺失不互相回退。本轮仅本地代码、测试和说明,不部署、不拨号、不请求真实 AI。

  • AI 使用任务内不可变授权快照:当前使用火山 ASR、OpenAI 兼容 LLM、百炼 task-based ASR/TTS,TTS 固定 WebSocket。任务的 params 为必填、可空的平坦对象,值为字符串、数字、布尔值或 null;原样透传,不校验厂商参数值、不补 SDK 默认值,不限制精确型号/音色。任务/session 的 model、voice、消息及事务身份具有优先权;params 中与生成字段重名的键忽略(包括同值、不同值或 null),不因此拒绝任务,不修改获批原始快照,其余参数继续原值透传。不设或检查 prompt.max_bytes,提示词不截断。ASR 输入格式与内部媒体格式分离:任务 params.sample_rate 声明所选服务支持的目标采样率,Agent 须在对接边界转换并保证实际音频与声明一致,不得忽略配置、仅重标参数或失败换率。当前内部媒体仍为单声道 16 kHz PCM16,ASR 边界转换尚未实现,已列入 docs/TODO.md;合同或 Schema 接受其它采样率不代表当前运行已经支持,不能以本次更新声称媒体兼容。ASR-only 不启动 LLM/TTS,完整 AI 不借旧语音测试的授权或参数。只有最终用户 ASR 文本的明确字面关键词可触发拒联/挂断;agent.conversation.hangup_keywords 仅接受必填非空 name/triggers/closingRemark 的对象数组,多组命中按配置顺序取第一组,经获批 TTS 完整播放该组结束语后主动挂断,不调用 LLM、不开始新一轮对话;合成/播放失败须明确报错并尝试结束,不重播,旧字符串数组直接拒绝;不由 SDK 默认值、环境、CLI、metadata 或宽松 Schema 改写业务参数,不因 SDK 重试产生第二次发起/收费或重播。日志只存脱敏版本/摘要/计数,不存密钥、prompt、完整对话或音频。

  • 私有配置位置(本机路径相对本仓库根目录,只读,绝不提交):.local/provider-ai.env 是 0600 的 KEY=VALUE 文件;字段名为 BAILIAN_API_KEY、BAILIAN_BASE_URL、BAILIAN_WSS_BASE_URL、BAILIAN_TTS_VOICE、VOLC_ASR_APP_NAME、VOLC_ASR_APP_KEY、VOLCENGINE_ACCESS_KEY、VOLCENGINE_SECRET_KEY、VOLCENGINE_REGION、VOLCENGINE_DISABLE_SSL。根目录 aliyun-oss.env 也是 0600,不是 shell env 文件;它以冒号分隔,字段名准确为 bucket、Endpoint、Region,以及 RAM 下的 username、accessKeyId、accessKeySecret(大小写须保持原样)。测试机 rogee 用户的现行 ARI 文件位于 ~/.config/go-sip-asterisk/{ari.conf,http.conf,ari-secret},不是旧 .local/asterisk-*/ari.conf;访问测试机前先核对已登记的 SSH 主机指纹,不展示 ari-secret。

  • 下次安全读取步骤:先确认工作目录是本仓库,用 stat 仅检查本机两份文件是否存在、所有者与权限 0600;不满足即停止。按各自格式在受限本机进程中解析所需字段到内存,不执行 source、不打印全文/字段值、不写临时明文副本,不把密钥、签名 URL、音频或完整对话带入聊天、日志、提交及长期证据。AI 的历史文件只可作为获准凭据来源,模型/voice/速度等仍由当前获批的 task/providers 快照固定,不能用环境变量覆盖。OSS 历史文件也不能直接传给 DISPATCHER_OSS_CONFIG_FILE:该运行配置要求私有 JSON、dispatcher_id 和 oss 字段,并以环境变量名称引用密钥;需按现行合同构造并核验授权后才能使用。普通构建和测试不读取这些私有文件;真实服务测试必须显式启用对应 opt-in 并受现行门禁约束。

  • 授权边界:本轮验收目标是三条已登记线路的真实接通及 LLM 正常应答;旧两个号码已分别在三条线路试拨,六通均为 SIP 480,零接通。新增号码的历史逐次授权不等于本次代码变更获准部署或拨号;本次全局审查本地业务硬编码并以 SaaS 配置快照决定任务、线路和额度,不部署、不拨号。上述 AI 与 OSS 私有配置仍仅用于另经明确授权的非生产测试,下次任务须重新确认范围和真实服务调用授权,不能沿用本轮或历史一次性授权。不得把历史配置直接当 SaaS 快照、任务授权或真实呼叫准入,不覆盖/清理旧 OSS 对象。

  • Agent 录音经受控双向 TLS 向 D 领取短期 OSS 上传授权,每次尝试只作一次 HTTPS PUT;正常上传不写录音文件,最终结果在 Dispatcher 确认前允许写入 Agent 私有临时结果文件,确认后删除;已确认挂断但结束回报未确认时须保留原结果并重报原结束事实;PUT 前预存的结果在成功未被确认时不得自行报告。首次明确失败须先完整保存录音与结果两份恢复文件,才从该时刻启动 48 小时重试;按 1、2、4、8、16、32、60 分钟及其后每 60 分钟的固定节奏显式重新申请授权,同一 OSS 目标、同一消息身份。PUT 结果未知不得盲目重传;48 小时届满仍失败时保留文件待人工,不伪造最终结果或自动清理。D 不转发文件,已确认结束的通话及时释放执行占用;未知执行仍占用。只有真实终结后才通过唯一 call.execute.result 回报录音路径、最终转写和拒联事实;无录音或录音生成失败以空 recording={} 和真实结果收口,生成失败须说明原因。不能恢复的录音不声称零丢失,也不伪造 OSS/SaaS 应用回执。凭据/TOKEN/签名 URL 不写入样例、日志、源码或证据。

SIP 与真实呼叫限制

线路 SIP 服务端(历史登记,非已验证线路) 主叫标识 被叫前缀
数企 61.132.228.221:5060 BD93205882 7089
中鼎 222.186.130.228:5060 mbkq 无
百应 160.202.254.79:5060 KQ91526 mka755108
  • 业务全线路的原始被叫号码仅由校验归属及任务后的 SaaS call.execute.payload.callee 确定;不在 Dispatcher、SaaS Mock 或抓证脚本设置固定号码/日期特判,不向任务快照增设号码列表。只接受 1–32 位 ASCII 数字;格式校验不等于真实拨号授权。不再另设本地固定的 09:00–20:00 窗口或每线路每号码每日 3 次上限;任务、线路时段和额度以 SaaS 配置快照校验为准,不等候/自动延迟/自动重试/静默换线。独立工具或非上述真实 SaaS 获批任务的真实试拨仍须使用者明确安排;本轮使用非正式配置的正式部署任务按当前授权执行。仅在 Agent 指定 --capture 时,由专用主机脚本在拨号前启用抓包和 PJSIP logger、签发与该通 event_id/trunk/原始号码绑定的短时有效活跃抓包凭证,调试 Agent 拒绝缺失/失效/不匹配的凭证。默认 Agent 不依赖外部抓包或凭证;独立 sip-call 的号码与线路仅来自本次显式命令和 ENV,不冒充业务任务授权。SaaS Mock 投递和本地时段测试不构成真实拨号授权。
  • 任务按周一至周日多个时段与指定排除日期配置,线路只有每周允许时段(没有线路排除日期),Asia/Shanghai 左闭右开、跨日拆分;缺失或不确定 fail-closed,不自动重拨。由 Dispatcher 在持久接纳与实际发出指令前判定,并取任务/获批 AI 较小通话时限;Agent 仅校验会话和签发期限,不重算外呼策略。本地 SaaS 快照策略测试与主机抓证/逐次授权须分别报告。
  • 当前修复仅在本地核验,未更新测试机上的旧多主叫 Mock 快照,也未部署或授权新呼叫。BD 等主叫原值不得清洗或当作 Digest 用户名;业务原始被叫号码不变,仅被选定数企 trunk 按规则构造 7089<原号>(其它线路使用自己的前缀),不重复加前缀。三条 trunk 独立,不能把同地址伪造为备用线路或换线重拨;服务商反馈 PCMA,对应 Asterisk allow=alaw,传输/注册/鉴权/并发仍待真实签收。不以 sipgo/diago 另造 Asterisk 替代架构。

运行环境、诊断与开发门禁

  • 项目是独立 Go module,工具链 Go 1.27.1;普通构建、测试、运行不读取父项目业务模块、数据库、env 或夹具。标准库和成熟官方 SDK 优先,Cobra 显式 agent/dispatcher,单制品分角色/权限/目录。禁止自行重写 SIP/ARI、RTP/RTCP/G.711、WebSocket、AMQP、SQLite 驱动、OSS 签名及 SDK 已覆盖的 AI 协议;核验现有依赖能力后再新增库。生产原生 Asterisk 仍由独立 Cell 的 systemd 统一管理,不声称当前 Mock 已完成真实媒体或 1000 路容量验收。
  • 生产 ECS 优先 Debian 13(Trixie)minimal;只有阿里云北京无可用镜像时允许 Ubuntu 24.04 LTS。Debian 12 仅供明确标记的非生产测试:必须在 Debian 12 原生构建 Asterisk,不得部署 Debian 13 编译的制品,也不得据此批准生产发布。Asterisk 直接安装在承载 ECS 主机,以 rogee 的 systemd --user 服务管理,核对 enabled+active;生产环境还须启用 loginctl enable-linger rogee 并验证重启后持续运行。非生产若未启用 lingering,必须标记重启自启动未验收。不得以前台进程或容器入口代替。
  • 开发、Mock、mixed、real 的非生产主机部署与诊断步骤默认强制,不因时间/旧环境/调用方参数跳过或静默降级;显式关闭即失败。每次新主机/版本/Cell 至少留存脱敏 ECS/EIP/网络只读核验、Debian/架构/磁盘/权限、rogee SSH 与加固、发布包/依赖 SHA-256、Asterisk/systemd enabled+active、ARI/PJSIP endpoint/contact、媒体 profile/端口及运行版本。
  • 非生产 mixed/real 呼叫必须通过 SaaS 下发的任务、线路时段与额度校验及逐次授权;ARI/PJSIP 状态必须可核验。仅指定 Agent --capture 时,拨号前启动受限 SIP/RTP 抓包和 Asterisk PJSIP logger,结束后采集 SIP 响应/INVITE–BYE 时间线、SDP codec/媒体地址端口、RTP 包/字节、录音与 ASR/LLM/TTS 事实及 SHA-256,失败通话也保存状态和抓包;此调试模式下 tcpdump/CAP_NET_RAW、PJSIP logger 或证据凭证任一不可用须失败关闭。默认 Agent 不依赖上述外部抓包工具,不能将未抓包详情作为抓包证据。独立 sip-call 不测试 AI/录音链路,其调试 pcap 只覆盖指定服务端 IP,不能据缺失 RTP 断言无媒体。原始抓包/日志/录音只写受限证据目录,聊天、提交与长期证据只存脱敏摘要/计数/状态码/hash,不含完整用户音频/对话或凭据。统一入口见 deploys/test/nonprod-call-evidence.sh;本地 make check 与 make release-check-local 不能代签主机诊断或生产门禁。
  • 当前完成前至少检查格式、当前合同和 Proto 来源/hash、go vet ./...、go test -race ./...、构建、确实运行的隔离 RabbitMQ/HTTPS/双向 TLS 端到端测试、业务单元覆盖率 ≥65% 及 A01–A12/K01–K16 对照。真实 SaaS/management/OSS/AI/Asterisk/ECS、第二节点/Cell/租户、多 D 额度、容量/N+1及生产切换必须另有事实与授权,任何本机 Mock 通过不得写成其签收。
  • 不自动提交/暂存/清理使用者在父项目或本项目的无关修改;并行开发仍须有可追溯 Git/合同基线、一 lane 一工作区/测试资源、无交叠写集合、合并后回归。本目标明确禁用子 Agent,不能以模型、fast 环境或外部服务不可用阻塞本地 Mock 目标。问题根因不明时补可观测性并诚实报告,不能用静默兜底伪装修复。