Files
lserp_cs_6.0/插件库/Lskj.AgentBridge/Deployment/FIELD_VALIDATION_RUNBOOK.md
2026-08-14 14:28:28 +08:00

15 KiB
Raw Permalink Blame History

客户现场放行路线图

每次桥调用都必须携带由核准 ERP 会话范围计算的 v3 sessionScopeToken;服务端权威复核缺失、格式错误或会话漂移,不能只依赖页面或 CLI 的本地检查。

本文是实施人员使用的短版路线图。详细字段、命令参数、证据结构和负例要求以 CUSTOMER_ACCEPTANCE.mdWRITE_ACCEPTANCE.md 为准。任何阶段未完成时,相关写命令必须保持未注册;不得用修改配置、跳过预检或手工拼接证据的方式放行。

阶段 0:源码与第三方前置条件

  • 已轮换所有曾进入聊天、日志、截图或临时文件的 API Key、数据库口令和机器人凭据。
  • 待发布源码来自已审查、无未提交文件的固定提交;桌宠包和旧 ERP 构建绑定同一 40 位提交号。
  • 已复核 guga-upstream-audit.v1.json,确认没有把 npm/网站 MIT 误当成素材许可;禁止生产机直接运行 npx codex-pets add guga,并已取得绑定实际精灵图 SHA-256、权利人、商业使用、客户部署、复制、展示、地域和期限的书面商用许可;同时完成 AstrBot AGPL/EULA 与 MiniMax API 服务条款、区域、计费和数据处理审查。
  • 客户已批准发布证书、RFC3161 时间戳服务、制品库、SBOM/恶意软件扫描和回滚负责人。

未满足以上任一项:只允许开发验证,不进入客户商用预检。

阶段 1Windows 签名构建

  • 在客户 Windows 构建机从固定干净提交运行 Build-LegacyErpAcceptance.ps1,生成独立的 LegacyArtifactRoot
  • 构建脚本在签名前完成最终 Ls_ERP.exelserp-cli.exe 和顶层 Lskj.*.dll 凭据扫描;未出现 legacy_runtime_hardcoded_sql_credential:<文件名>,且扫描失败时日志不包含用户名或口令值。
  • Ls_ERP.exelserp-cli.exe 及桥/内核依赖通过 .NET Framework 4、x86、DevExpress 15.2、CEF 和 Authenticode 检查。
  • 使用同一客户发布证书签署桌宠 Host 的 EXE 与两个业务 DLL;保存签名后哈希。
  • Verify-LserpCommercialPackage.ps1 对最终 ZIP、解包清单、WebView2、AstrBot、MiniMax 探针、素材授权、发布策略和精确 ERP PID 全部通过。

未签名、提交号不一致、二进制在取证后被修改、存在多个 ERP 实例但未绑定 PID:立即停止。

阶段 2:客户只读画像与配置映射

  • 仅使用客户批准的只读账号和只读脚本核对表、字段、过程、单据状态、权限和低代码配置;口令只从安全标准输入或客户凭据系统读取。
  • 对尚未允许正常 ERP 登录的零写入目标库,先在 Windows PowerShell 5.1 交互执行 $credential = Get-Credential -UserName <SQL只读账号>,再运行 Invoke-LserpSelectOnlyCatalogSnapshot.ps1 -Server <受信任TLS端点> -Database <库名> -Credential $credential -OutputPath <新snapshot.json>。脚本强制 Encrypt=true、系统证书验证、ApplicationIntent=ReadOnly,并在目录读取前后各检查一次数据库/服务器角色、数据库级 DML/DDL/EXECUTE、所有用户表/视图、过程/函数和 Schema 的有效写权限;任一次发现可写即返回 database_principal_not_select_only,不会发布快照或降级继续。
  • SELECT-only 快照只执行两段随包固定且已通过 TSql100 AST 校验的 sys.* 查询;不执行存储过程、不读业务行。采集器还把 PowerShell 实际加载的脚本 AST 字节与连接前、读取后的磁盘脚本 SHA-256 逐字绑定,脚本运行中被替换即返回 tool_source_changed。输出采用当前用户与 LocalSystem ACL、CreateNew 语义,只包含目标身份哈希、兼容级别、对象计数和最多 100000 个目录成员哈希,不包含服务器名、数据库名、登录名、密码或物理对象名。它用于零写入初始目录证明,不能代替后续绑定真实 ERP 用户/账套/子系统的桥会话预检。
  • 立即用最终 CLI 运行 lserp-cli adapters verify-catalog-snapshot --input <snapshot.json> --profile <customer-profile.json> --tool-sha256 <随包采集脚本SHA-256>;只接受 schemaVersion=1.1。只有工具字节稳定、24 小时时效、权限前后双检、TLS/只读声明、集合哈希、数据库身份/计数和画像关键目录全部匹配时,onlineMetadataMatches=true。验证完全离线且结果固定 registrationReady=false;缺失项只以 SHA-256 表示,不能据此自动修改画像或启用写命令。
  • 现场优先使用 Invoke-LserpSelectOnlyProfilePreflight.ps1 一次完成上述两步。它要求显式固定画像、采集器、最终签名 CLI 的 SHA-256 和 CLI 签发者,只通过 PSCredential 对象把口令交给采集器;随后锁定三份输入、调用离线验证器,并以受限 ACL/CreateNew 分别发布快照和脱敏报告。报告不含服务器、库、主体、对象名或路径;目录漂移会保留 passed=false 报告并返回非零,其他协议/身份故障不会留下未验证快照。该包装器仍固定 registrationReady=false,不会登录旧 ERP、修改画像或开启业务写入。
  • 先由实施人员在客户机本地核对 ERP 已登录界面,并从批准的 ERP 启动记录/只读会话交接中取得本次会话的 PID、数据库作用域指纹、用户编号、用户名、账套、子系统和管理员属性;不得猜测或让模型生成这些值。桥/工作流命令(包括独立签名管理员 lserp-cli.exe)不接受只传 PID 的引导调用。需要用 CLI 复核时,必须把七项范围完整展开,例如 lserp-cli.exe bridge context --erp-process-id <PID> --expected-database-scope-fingerprint <64位小写SHA-256> --expected-user-id <用户编号> --expected-user-name <用户名> --expected-account-book <账套> --expected-subsystem-id <子系统编号> --expected-is-administrator <true|false>;该调用只验证已批准的预期范围与当前 ERP 上下文逐项一致,不能反过来作为“先连接再猜范围”的来源。不得把原始响应发给模型或写入普通日志。最终 ZIP 中的受限 Host/lserp-agent-cli.exe 从第一次调用起同样要求完整七项范围。将 field-readonly-validation.example.json 复制到包外 ACL 受控的新文件,逐项填写运行时 CLI 版本/SHA-256/签发者、ERP/预检脚本 SHA-256、PID、上述预期会话、发布策略客户 ID/SHA-256,以及 116 个 purchase/leave/diagnosis/support → 客户实际模块或导航编号 绑定;模板固定 approved=false 和零哈希,禁止直接使用。审批人核对后把 approved=true,审批窗口不得超过 24 小时,且 databaseCredentialsIncluded 必须保持 false。管理员 lserp-cli.exe 仅用于本地复核、离线配置与验收,不得填入运行时 CLI 身份字段。
  • 对审核后的原始输入文件计算 SHA-256,先运行 Invoke-LserpFieldReadOnlyValidation.ps1 -InputPath <受控输入.json> -ExpectedInputSha256 <原始文件SHA256> -OutputPath <新交接报告.json> -ValidateInputOnly。通过后换一个新的交接报告路径、去掉 -ValidateInputOnly 执行;包装器会同时锁定输入和 Invoke-LserpReadOnlySessionPreflight.ps1,逐项传递 PID、CLI/ERP 身份、管理员属性、用户、账套、子系统、数据库指纹、发布策略、动态模块集合、三个工作流开关和超时。它不会从 Bridge 自动回填或信任这些审批值,也不接收数据库地址、用户名、密码或连接串。不同 ERP 用户/PID/账套必须使用不同审批文件,不能把普通采购/请假会话和管理员诊断会话拼成一个虚假范围。
  • 从最终桌宠核对标题下方只显示账套、子系统、用户和数据库指纹前 12 位证据,不显示服务器、库名、连接串或完整指纹。生成只读或可执行预览后切换数据库、用户、账套和子系统,确认旧计划在执行请求前作废;恢复原范围仍必须重新规划。数据库和登录身份不得作为模型业务参数传入。
  • 命名管道格式必须固定为 lserp.agent.<PID>.<bridgeInstanceId>。在同一 ERP PID 内重建命令桥,确认新发现文件的 bridgeInstanceId 变化,管道名也从 lserp.agent.<PID>.<旧bridgeInstanceId> 变为 lserp.agent.<PID>.<新bridgeInstanceId>;保留旧发现文件覆盖新桥监听前后的竞态窗口,旧客户端不得触达新桥。旧桌宠 Host/AstrBot 会话必须返回 erp_bridge_instance_changed 且不能发送业务请求,重新运行启动器后新会话才恢复。该标识不得进入模型、业务预览或交接报告。
  • 只读会话预检只能调用 lserp-agent-cli versionbridge health/context/capabilitiesbridge plan module.parameters;每个桥子进程参数白名单必须同时包含精确 PID、数据库作用域指纹、用户编号、用户名、账套、子系统和管理员布尔值。受限 CLI 自身要在目标命令前后复核上下文,包装器还要独立比对审批范围,二者任一发现漂移都丢弃结果。1.5 报告必须包含 cli_runtime_identityrollout_database_scopeexpected_session_scopedynamic_module_execution_contracts,证明 bridgeOnly=truedatabaseDirectAccess=false,并显示 commandExecuteInvoked=falsedirectDatabaseConnectionUsed=falsebusinessWriteAttempted=false。1.1 交接报告必须绑定同一运行时 CLI 版本、SHA-256 和签发者。报告只能保存用户/账套/子系统哈希、动态合同/配置/原生执行指纹、经审核的保存族、参数类型与可编辑/必填数量、载荷策略及新增/修改阻断状态;载荷数量必须与参数合同一致,不能保存标签、参数 ID、业务值或物理配置。第一次参数发现使用 validationStage=discovery,可不要求尚未注册的业务工作流;适配器与发布策略完成后使用 validationStage=final,每个模块业务角色必须与对应工作流开关严格一致。诊断开关要求审批值和当前上下文都为内置管理员。
  • 不运行写 SQL,不启用草案中的写开关,不把真实业务值、连接串、原始异常或原始 SQL 放入聊天、模型上下文和交付证据。
  • 配置人员逐项复核 customer-profiles 候选映射;最终画像、business-adapters.jsoncommand-rollout.json 放在包外受 ACL 保护的客户目录,并绑定原始字节 SHA-256。
  • 在任何在线激活操作前运行 lserp-cli adapters activation-checklist --input <客户画像.json>。当前示例画像必须以退出码 6 列出固定 5 个采购、4 个请假开放阻断项,且输出只含稳定代码、所需证据类型和固定下一步;不得含数据库名、物理字段、画像证据正文或 SQL。全部阻断关闭后退出码才为 0,但 activationAllowed/registrationReady 仍必须为 false,继续走签名验收和 V2/V3 运行时复核。
  • 只读探针证明实际客户库兼容性;任何字段、类型、过程、账套、子系统、用户权限或模块代码漂移都先回到配置评审。

输入/预检脚本哈希、审批窗口、预期数据库指纹、用户、账套、子系统或管理员属性任一不一致,ERP 会话在预检中切换、只读计划出现 executionAllowed=true、发现意外数据变化、权限超出只读范围、脱敏失败或映射歧义:立即停止并保全审计记录。

阶段 3:可恢复非生产写工作流 UAT

  • 客户书面确认该库是可恢复的非生产 UAT,备份与恢复演练、ERP 原生确认、事务和审计查询均已验证。
  • 运行 New-WorkflowUatAuthorization.ps1 签发最长 24 小时、绑定客户/环境/ERP/CLI/包/画像/策略/用例的短期授权;令牌库始终留在受限目录,绝不进入交付包、聊天或模型上下文。
  • 运行 New-WorkflowWriteUatCampaign.ps1 建立固定活动;管理员 lserp-cli.exe 仅用于离线验证,最终包内 lserp-agent-cli.exe 仅用于版本与桥调用,两者路径、哈希和签发者分别锁定;每次开始或恢复先运行 Test-WorkflowWriteUatCampaign.ps1
  • 严格按唯一 nextCase 逐项运行 Invoke-WorkflowWriteCaseCapture.ps1:采购 13 项、请假 19 项,一次只执行一个用例,禁止循环或批量写入;每项原始索引都必须绑定实际运行 CLI 的版本、SHA-256 和签发者。
  • 每项都由 DBA 只读核对业务变化数、事务、幂等、权限重检、原生确认、命令审计及来源附件摘要;确认后三项漂移场景必须保留人工暂停阶段。
  • 采购确认页完整展示单据、来源、金额和每一条明细,滚动到底后才可确认;请假创建完整展示员工、类型、流转类别、起止时间、工时、原因和“创建后提交=false”,提交审批另行确认。

授权过期或串用、ERP/CLI/包/画像/策略哈希漂移、一次触发多个用例、无法证明回滚或审计:立即停止。先恢复环境并重新签发活动,不复用旧令牌或证据。

阶段 4:低代码初始化诊断取证

  • 分别验证:静态配置错误、初始化 SQL 失败、初始化无 SQL 失败、初始化超时/卡死风险四类场景。
  • 诊断确认页必须显示模块代码、导航代码、模块名、是否已打开、是否支持跟踪、跟踪范围、是否支持强制终止、最大事件数和最大时长。
  • 现场明确看到“20 秒只限制 SQL 证据采集窗口,旧版 UI 初始化无法安全强制终止”的风险提示;可能卡死的模块只在隔离测试环境复现。
  • 证据只保留会话别名、阶段、分类和调用位置,不保留参数值、原始 SQL、原始异常或客户数据。

范围、限制或风险说明不完整,页面声称能强制终止旧模块,或者诊断触及非目标 ERP 实例:禁止执行。

阶段 5:总验收与放行

  • CUSTOMER_ACCEPTANCE.md 收集 23 个原始制品;采购、请假、诊断分别保留自己的 ERP PID/用户/子系统 1.4 预检和绑定其 SHA-256 的现场交接,采购与请假各自使用单工作流 UAT 授权,诊断必须为管理员。不得合并三份会话证据,也不包含令牌库、审核输入原文、原始发票、请假原因、数据库口令或连接串。
  • 使用 New-CustomerAcceptanceBundle.ps1 生成客户 RSA-SHA256 总签章,并由最终签名 lserp-cli acceptance verify-customer-bundle 在隔离机复验。
  • 客户业务、DBA、安全、实施和发布负责人共同签收;发布后仍保持默认拒绝、最小权限、限流、熔断、审计和可回滚。
  • 记录最终 ZIP SHA-256、旧 ERP/CLI 哈希、签发者指纹、客户/环境标识、发布时间和回滚版本;不得记录秘密值。

缺少任一原始制品、总签章验证失败、制品过期或哈希不一致:不得上线。

全程停止条件

出现以下任一情况,无论处于哪个阶段都立即停止并转人工评审:

  • 发现秘密泄漏、原始客户数据进入模型/日志/证据,或只读阶段产生任何写入。
  • 目标客户、账套、子系统、ERP 用户、模块、ERP PID、提交号或文件哈希不一致。
  • 使用未签名/签名失效二进制、旧候选包、脏源码构建或未经客户批准的第三方组件。
  • 无法证明一次确认只对应一个计划、一次业务动作、一个事务和一条完整审计链。
  • 现场状态与预览不一致、命令返回未知结果、桥或 ERP 重启、授权过期、恢复点不可用。