docs(release): register Android 0.1.13 candidate

This commit is contained in:
key
2026-07-29 12:18:00 +08:00
parent af8af2f6dd
commit cc1865a979
10 changed files with 43 additions and 31 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
## Unreleased ## Unreleased
- **2026-07-29,移动端固定码认证与身份失败关闭收口,候选升级为 `0.1.13 (113)`,未发布生产**:生产验证只选择已存在 `app_user` 且双向唯一的在职组织主体;固定码请求、登录、非空项目范围、认证首页、训练历史/画像、五通道、我的反馈、大喇叭、考试、案例/全网只读入口、退出、旧令牌拒绝、等待防刷窗口后的再次获取和重新登录全部通过,应用日志确认两次验证码请求均命中“未真实发送短信”分支。脚本不输出手机号、固定码或令牌,不触发自动注册,不提交反馈、训练、附件、ASR/TTS 或 Agent 请求。后端 `/api/aihr/mobile/me` 与认证首页遇到身份缺失、组织查询异常、无在职身份或后台账号时改为失败关闭;前端角色和岗位加载失败清空缓存并展示明确错误,不再回退普通员工、陈旧岗位或公开首页。移动端 199 项、`ruoyi-aihr` 700 项和类型检查通过;DCloud 云端证书 APK 大小 `33,921,543` 字节、SHA-256 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,API 35、v2 测试签名、禁止明文 HTTP、包内业务资源/登录法务/身份失败关闭和敏感值深检通过。5 个场景、30 道题与五通道处理人统一签认单已落地,但正式内容仍为 `0/5`、`0/30`,五个处理角色有效绑定均为 `0`。本项未发布后端、H5、数据库或生产静态资源;新 APK 还须在干净提交上完成统一 RC 冻结。 - **2026-07-29,移动端固定码认证与身份失败关闭收口,候选升级为 `0.1.13 (113)`,未发布生产**:生产验证只选择已存在 `app_user` 且双向唯一的在职组织主体;固定码请求、登录、非空项目范围、认证首页、训练历史/画像、五通道、我的反馈、大喇叭、考试、案例/全网只读入口、退出、旧令牌拒绝、等待防刷窗口后的再次获取和重新登录全部通过,应用日志确认两次验证码请求均命中“未真实发送短信”分支。脚本不输出手机号、固定码或令牌,不触发自动注册,不提交反馈、训练、附件、ASR/TTS 或 Agent 请求。后端 `/api/aihr/mobile/me` 与认证首页遇到身份缺失、组织查询异常、无在职身份或后台账号时改为失败关闭;前端角色和岗位加载失败清空缓存并展示明确错误,不再回退普通员工、陈旧岗位或公开首页。干净提交 `af8af2f6` 的统一 RC 已达到 `releaseEligible=true`:移动端 199 项、`ruoyi-aihr` 700 项、类型检查、H5/App、管理端构建、后端打包和 APK 深检全部通过,证据在 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`。DCloud 云端证书 APK 大小 `33,921,543` 字节、SHA-256 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,API 35、v2 测试签名、禁止明文 HTTP、包内业务资源/登录法务/身份失败关闭和敏感值深检通过;候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD`,生产只读发布计划通过,现网仍为 `46C99CFF…`。5 个场景、30 道题与五通道处理人统一签认单已落地,但正式内容仍为 `0/5`、`0/30`,五个处理角色有效绑定均为 `0`。本项未发布后端、H5、数据库或生产静态资源;固定码、登录和重新登录不再列为功能缺口。
- **2026-07-29,Android 法务交互按企业内测体验收口,候选升级为 `0.1.12 (112)`,未发布生产**:取消启动阶段的 DCloud 原生隐私确认,统一由登录页协议勾选承担同意门槛;协议默认未勾选,服务协议与隐私政策可点击查看,未勾选时发送验证码和登录均在请求前失败关闭。两个公开 HTTPS 地址进入版本化 `.env`,npm 与 HBuilderX 云打包共用;源码、App-Plus 产物和 APK 门禁同时检查 `prompt=none`、登录法务链接、未勾选拦截、网络安全与敏感值。DCloud 独立内测 APK `com.yincheng.wygj 0.1.12 (112)` 大小 `33,921,458` 字节,SHA-256 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`,API 35、v2 测试签名、`usesCleartextTraffic=false`;本机 Android 15/API 35 虚拟机全新安装后确认原生隐私层不可见、四项敏感权限未授权、无 Crash/ANR。干净提交 `b9e08789` 的统一 RC 为 `releaseEligible=true`:移动端 199 项、后端 698 项、类型检查、H5/App、管理端、后端打包和 APK 深检全部通过,证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`。双提交交付包 `bangdao-aug1-0.1.12-112-b9e08789-ops6bf365d5.zip` 大小 `192,926,061` 字节、SHA-256 `E8014A0C5BD56B66B198710E75E2B8DDEC86002D1E3BC6CAF56FB3454A199C33`,14 个条目及内部哈希逐条通过;新后端 JAR `3F9F4506…` 的生产只读计划也通过目标、服务、公开入口、64/64 schema 和生产禁 DDL 检查,现网 JAR 仍为 `46C99CFF…`,未执行部署。当前 AVD 为 `x86_64`,APK 只含 `arm64-v8a/armeabi-v7a`,DCloud Weex 在跨架构转译时实际报 `spinWaitPeer timeout`、`sender is null` 和 IPC timeout;390×844 Playwright 验证仅作为布局、链接和请求前拦截的补充证据,不替代 App 运行或认证业务验收,也不因此修改发布 ABI、增加降级链或启用兜底内容。证据位于 `output/playwright/aug1-login-consent/`。本项没有发布后端、H5、数据库或新的生产静态资源。 - **2026-07-29,Android 法务交互按企业内测体验收口,候选升级为 `0.1.12 (112)`,未发布生产**:取消启动阶段的 DCloud 原生隐私确认,统一由登录页协议勾选承担同意门槛;协议默认未勾选,服务协议与隐私政策可点击查看,未勾选时发送验证码和登录均在请求前失败关闭。两个公开 HTTPS 地址进入版本化 `.env`,npm 与 HBuilderX 云打包共用;源码、App-Plus 产物和 APK 门禁同时检查 `prompt=none`、登录法务链接、未勾选拦截、网络安全与敏感值。DCloud 独立内测 APK `com.yincheng.wygj 0.1.12 (112)` 大小 `33,921,458` 字节,SHA-256 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`,API 35、v2 测试签名、`usesCleartextTraffic=false`;本机 Android 15/API 35 虚拟机全新安装后确认原生隐私层不可见、四项敏感权限未授权、无 Crash/ANR。干净提交 `b9e08789` 的统一 RC 为 `releaseEligible=true`:移动端 199 项、后端 698 项、类型检查、H5/App、管理端、后端打包和 APK 深检全部通过,证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`。双提交交付包 `bangdao-aug1-0.1.12-112-b9e08789-ops6bf365d5.zip` 大小 `192,926,061` 字节、SHA-256 `E8014A0C5BD56B66B198710E75E2B8DDEC86002D1E3BC6CAF56FB3454A199C33`,14 个条目及内部哈希逐条通过;新后端 JAR `3F9F4506…` 的生产只读计划也通过目标、服务、公开入口、64/64 schema 和生产禁 DDL 检查,现网 JAR 仍为 `46C99CFF…`,未执行部署。当前 AVD 为 `x86_64`,APK 只含 `arm64-v8a/armeabi-v7a`,DCloud Weex 在跨架构转译时实际报 `spinWaitPeer timeout`、`sender is null` 和 IPC timeout;390×844 Playwright 验证仅作为布局、链接和请求前拦截的补充证据,不替代 App 运行或认证业务验收,也不因此修改发布 ABI、增加降级链或启用兜底内容。证据位于 `output/playwright/aug1-login-consent/`。本项没有发布后端、H5、数据库或新的生产静态资源。
- **2026-07-28 至 2026-07-29,前一版 Android 受控内测候选包与法务链路,历史总体 No-Go**:补齐登录页协议默认不勾选与法务地址失败关闭、App-Plus 原生隐私配置生成/校验、APK 包名/版本/API/签名/哈希/包内资源一致性/敏感值门禁、DCloud 云证书自定义基座和独立测试包流程;《服务协议》《隐私政策》静态页已部署到 `/legal/`,发布前整站备份为 `/opt/wygj/backups/www-20260728224710`。客户端法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码也不再以源码常量进入安装包;五个文件选择服务与九个消费页面进一步统一“用户取消/平台失败”分流,取消后不再残留上传或转写错误;直通车首次弱网加载失败后可原位重试,失败时清空旧通道并禁止提交。当时独立 APK `com.yincheng.wygj 0.1.10 (110)` 的 `targetSdkVersion=35`,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`;Android 原生网络安全配置经 APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包。本机 `Medium_Phone` Android 15/API 35 虚拟机已完成从 `0.1.9` 保留数据覆盖升级和冷启动,真实显示原生隐私弹窗,四项敏感权限保持未授权且未见 FATAL/ANR;`0.1.6` 已在 vivo V2443A(Android 15)完成覆盖安装和冷启动。代码候选提交 `dc20b920` 已在干净工作区通过统一 RC 门禁,`releaseEligible=true`:移动端 198 项测试、类型检查、H5/App 构建、管理端构建、`ruoyi-aihr` 698 项全量测试、后端打包及 APK 强化门禁全部通过;最小交付包 SHA-256 为 `4BAA79B2CA2C4D486B6194288D90022D5F994A4D8C8E05D7C2DDD87F9BF5B3B7`,解压后 9 个文件、其中 8 个载荷逐文件复验通过。只读生产预检确认根站、租户接口、移动首页和 64/64 schema 门禁通过,但生产后端模块、管理端和移动 H5 与本地候选仍不一致;用户隐私选择、权限反例、认证态核心业务和正式内容也未完成,故当时 Go/No-Go 为 **No-Go**。本项没有新增生产发布、服务重启、数据库或静态资源变更。 - **2026-07-28 至 2026-07-29,前一版 Android 受控内测候选包与法务链路,历史总体 No-Go**:补齐登录页协议默认不勾选与法务地址失败关闭、App-Plus 原生隐私配置生成/校验、APK 包名/版本/API/签名/哈希/包内资源一致性/敏感值门禁、DCloud 云证书自定义基座和独立测试包流程;《服务协议》《隐私政策》静态页已部署到 `/legal/`,发布前整站备份为 `/opt/wygj/backups/www-20260728224710`。客户端法务校验已移除 App-Plus 不保证支持的浏览器 `URL` 构造器,测试验证码也不再以源码常量进入安装包;五个文件选择服务与九个消费页面进一步统一“用户取消/平台失败”分流,取消后不再残留上传或转写错误;直通车首次弱网加载失败后可原位重试,失败时清空旧通道并禁止提交。当时独立 APK `com.yincheng.wygj 0.1.10 (110)` 的 `targetSdkVersion=35`,SHA-256 为 `20CB16B4E9D024DBF5EEEF577BFBA3B4DF5E5E78B597BABB99CB7450C7AE5034`;Android 原生网络安全配置经 APK 反编译确认 `usesCleartextTraffic=false`、`networkSecurityConfig` 引用和系统证书信任配置均已进入安装包。本机 `Medium_Phone` Android 15/API 35 虚拟机已完成从 `0.1.9` 保留数据覆盖升级和冷启动,真实显示原生隐私弹窗,四项敏感权限保持未授权且未见 FATAL/ANR;`0.1.6` 已在 vivo V2443A(Android 15)完成覆盖安装和冷启动。代码候选提交 `dc20b920` 已在干净工作区通过统一 RC 门禁,`releaseEligible=true`:移动端 198 项测试、类型检查、H5/App 构建、管理端构建、`ruoyi-aihr` 698 项全量测试、后端打包及 APK 强化门禁全部通过;最小交付包 SHA-256 为 `4BAA79B2CA2C4D486B6194288D90022D5F994A4D8C8E05D7C2DDD87F9BF5B3B7`,解压后 9 个文件、其中 8 个载荷逐文件复验通过。只读生产预检确认根站、租户接口、移动首页和 64/64 schema 门禁通过,但生产后端模块、管理端和移动 H5 与本地候选仍不一致;用户隐私选择、权限反例、认证态核心业务和正式内容也未完成,故当时 Go/No-Go 为 **No-Go**。本项没有新增生产发布、服务重启、数据库或静态资源变更。
- **2026-07-29,发布预检支持定向后端/schema 范围和冻结物核验,未发布**:`release-preflight.sh` 不再把远端后端或 schema 核验强制绑定到管理端/H5 静态匹配;定向后端发布可只启用 `RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true`,且只要求本地后端 JAR 新鲜。完整包口径仍必须同时启用远端静态、后端和 schema 三项。新增范围回归脚本,校验缺少 `RELEASE_REMOTE_URL` 时失败关闭、定向模式不回退为静态耦合、完整模式命令仍保留;`feece9bb` 再新增 `RELEASE_ARTIFACT_COMMIT` 与 `RELEASE_LOCAL_BACKEND_PATH`,允许从后续文档提交上安全地核验冻结提交及其实际候选 JAR。提交 `566f222e` 后只重建后端并实跑生产只读定向预检:输出没有管理端/H5 哈希,根站、租户、移动首页、64/64 schema 和生产禁 DDL 门禁通过,最终仅因现网/候选 AIHR 模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败。随后以 `dc20b920` 和发布 ZIP 解压 JAR 再跑后端只读预检,确认候选整包哈希 `8c676f2f…`,仍仅在同一模块差异处失败;这证明范围和冻结物选择正确,不代表后端已经发布。本项没有执行生产同步、重启或数据库变更。 - **2026-07-29,发布预检支持定向后端/schema 范围和冻结物核验,未发布**:`release-preflight.sh` 不再把远端后端或 schema 核验强制绑定到管理端/H5 静态匹配;定向后端发布可只启用 `RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true`,且只要求本地后端 JAR 新鲜。完整包口径仍必须同时启用远端静态、后端和 schema 三项。新增范围回归脚本,校验缺少 `RELEASE_REMOTE_URL` 时失败关闭、定向模式不回退为静态耦合、完整模式命令仍保留;`feece9bb` 再新增 `RELEASE_ARTIFACT_COMMIT` 与 `RELEASE_LOCAL_BACKEND_PATH`,允许从后续文档提交上安全地核验冻结提交及其实际候选 JAR。提交 `566f222e` 后只重建后端并实跑生产只读定向预检:输出没有管理端/H5 哈希,根站、租户、移动首页、64/64 schema 和生产禁 DDL 门禁通过,最终仅因现网/候选 AIHR 模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败。随后以 `dc20b920` 和发布 ZIP 解压 JAR 再跑后端只读预检,确认候选整包哈希 `8c676f2f…`,仍仅在同一模块差异处失败;这证明范围和冻结物选择正确,不代表后端已经发布。本项没有执行生产同步、重启或数据库变更。
+1 -1
View File
@@ -11,7 +11,7 @@
- 品牌:管理端与员工端统一显示“帮道”,继续使用现有红色品牌图标。 - 品牌:管理端与员工端统一显示“帮道”,继续使用现有红色品牌图标。
- 基础链路:租户列表、验证码、`000000 / admin / admin123` 加密登录已验证。 - 基础链路:租户列表、验证码、`000000 / admin / admin123` 加密登录已验证。
- 管理端:除 AI 面试、训练、案例、SOP 和资料处理外,已包含大喇叭发布、单文件提炼与多岗位解读、五渠道直通反馈收件箱、内容/任务运营、问题榜运营、知识空间、全网 AI 配置和组织权限;员工个人训练、主管复盘、团队难题、成长证据与训练录音仅在认证 APP 按项目范围访问。 - 管理端:除 AI 面试、训练、案例、SOP 和资料处理外,已包含大喇叭发布、单文件提炼与多岗位解读、五渠道直通反馈收件箱、内容/任务运营、问题榜运营、知识空间、全网 AI 配置和组织权限;员工个人训练、主管复盘、团队难题、成长证据与训练录音仅在认证 APP 按项目范围访问。
- 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;“问”已改为数字师傅 Agent,文字、ASR 转写和图片/视频统一先做意图规划,再按服务端权限调用知识、训练、待办、记忆、媒体或全网工具,寒暄和不完整表达不再机械落入 RAG。现有能力还包括手机号登录、30 分钟短期多轮、原文件/视频受控交付、大喇叭公司文件摘要/下载/多岗位解读/追问、五渠道直通反馈、“记一下”确认卡、三级字号、训练/题目反馈、问题榜与积分、岗位考试、案例、候选面试/资料、主管复盘/派发及学员模式。Agent 代码已随 2026-07-25 完整包部署;2026-07-29 当前 DCloud 云端证书内测 APK 为 `0.1.13 (113)`,SHA-256 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,启动阶段不展示 DCloud 原生隐私确认,法务同意统一由登录页承担。该版进一步让认证身份、角色和组织岗位异常失败关闭,不再回退为普通员工或公开首页;移动端 199 项、`ruoyi-aihr` 700 项、类型检查、App-Plus 资源和 APK 深检已通过。生产现有在职 APP 账号的固定码链路已经完整通过首次获取/登录、认证只读主路径、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录,应用日志确认两次均未真实发送短信。当前 x86_64 AVD 对仅含 ARM ABI 的 DCloud Weex 运行时出现 IPC 超时;浏览器截图只作布局和交互补充证据,不替代 App 运行、认证业务或设备能力验收,也不因此修改发布 ABI、增加降级路径或启用兜底内容。正式可发布场景仍为 `0/5`、有据标准答案为 `0/30`,五个处理角色有效绑定均为 `0`;生产后端、业务签认和发布授权尚未闭环,当前 Go/No-Go 仍为 No-Go。旧 `mobile/` 只用于历史回溯。 - 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;“问”已改为数字师傅 Agent,文字、ASR 转写和图片/视频统一先做意图规划,再按服务端权限调用知识、训练、待办、记忆、媒体或全网工具,寒暄和不完整表达不再机械落入 RAG。现有能力还包括手机号登录、30 分钟短期多轮、原文件/视频受控交付、大喇叭公司文件摘要/下载/多岗位解读/追问、五渠道直通反馈、“记一下”确认卡、三级字号、训练/题目反馈、问题榜与积分、岗位考试、案例、候选面试/资料、主管复盘/派发及学员模式。Agent 代码已随 2026-07-25 完整包部署;2026-07-29 当前 DCloud 云端证书内测 APK 为 `0.1.13 (113)`,SHA-256 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,启动阶段不展示 DCloud 原生隐私确认,法务同意统一由登录页承担。该版进一步让认证身份、角色和组织岗位异常失败关闭,不再回退为普通员工或公开首页;移动端 199 项、`ruoyi-aihr` 700 项、类型检查、App-Plus 资源和 APK 深检已通过。干净提交 `af8af2f6` 的统一 RC 已达到 `releaseEligible=true`,证据在 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`;候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD`,生产只读发布计划通过但未部署。生产现有在职 APP 账号的固定码链路已经完整通过首次获取/登录、认证只读主路径、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录,应用日志确认两次均未真实发送短信;固定码、登录和重新登录不再列为功能缺口。当前 x86_64 AVD 对仅含 ARM ABI 的 DCloud Weex 运行时出现 IPC 超时;浏览器截图只作布局和交互补充证据,不替代 App 运行、认证业务或设备能力验收,也不因此修改发布 ABI、增加降级路径或启用兜底内容。正式可发布场景仍为 `0/5`、有据标准答案为 `0/30`,五个处理角色有效绑定均为 `0`;生产后端、业务签认和发布授权尚未闭环,当前 Go/No-Go 仍为 No-Go。旧 `mobile/` 只用于历史回溯。
- 英雄路径:AI 面试(真模型出题/评分)、三角色对练(真 LLM 客户回复+评分,ASR/TTS 配置后支持语音)、案例沉淀(真实语音上传+ASR 转写+模型整理)均为真模型优先、未配置或失败回退本地兜底;生产短音频 ASR 当前为阿里云百炼 `qwen3-asr-flash`,SiliconFlow audio 接口保留兼容。SOP 知识库已接中文关键词 + MySQL Fulltext + Qdrant 混合召回 + rerank 重排,支持 txt/md/PDF/Word/Excel/PPT/图片/视频上传解析入库(图片走 vision OCR,视频走 ffmpeg 抽音轨转写+关键帧描述),资料处理中心支持 ZIP 异步展开后逐文件入队;模型配置页可查看向量库维度/点数并一键重建。 - 英雄路径:AI 面试(真模型出题/评分)、三角色对练(真 LLM 客户回复+评分,ASR/TTS 配置后支持语音)、案例沉淀(真实语音上传+ASR 转写+模型整理)均为真模型优先、未配置或失败回退本地兜底;生产短音频 ASR 当前为阿里云百炼 `qwen3-asr-flash`,SiliconFlow audio 接口保留兼容。SOP 知识库已接中文关键词 + MySQL Fulltext + Qdrant 混合召回 + rerank 重排,支持 txt/md/PDF/Word/Excel/PPT/图片/视频上传解析入库(图片走 vision OCR,视频走 ffmpeg 抽音轨转写+关键帧描述),资料处理中心支持 ZIP 异步展开后逐文件入队;模型配置页可查看向量库维度/点数并一键重建。
- 资料处理:已新增解析任务状态页,按 `aihr_knowledge_attach` 和 `aihr_knowledge_fragment` 展示等待解析、解析中、已完成、失败、片段数和向量化状态;任务列表按当前筛选结果前端分页(10/20/50 条,筛选或刷新回到第一页)。页面只保留“批量导入”,通过异步队列处理多文件或 ZIP,不提供浏览器目录选择和服务端目录导入入口。后端目录导入接口仅保留为运维/调试能力。 - 资料处理:已新增解析任务状态页,按 `aihr_knowledge_attach` 和 `aihr_knowledge_fragment` 展示等待解析、解析中、已完成、失败、片段数和向量化状态;任务列表按当前筛选结果前端分页(10/20/50 条,筛选或刷新回到第一页)。页面只保留“批量导入”,通过异步队列处理多文件或 ZIP,不提供浏览器目录选择和服务端目录导入入口。后端目录导入接口仅保留为运维/调试能力。
- 组织人员:`aihr_org_snapshot` 本地 reset 保留演示 seed;生产通过 `POST /api/aihr/org/sync` 同步外部组织。2026-07-25 记录的生产快照为 3417 人、2938 人在职且均有姓名、3392 个手机号映射、175 名在职主管和 20 名项目经理;姓名通过稳定 `employee_id` 定向补齐,未执行全量覆盖。当前上游 `employee_number` 与既有主体不一致且手机号大量脱敏,修复契约前禁止强制全量同步;人数属于时点事实,发布或验收前应重新查询。 - 组织人员:`aihr_org_snapshot` 本地 reset 保留演示 seed;生产通过 `POST /api/aihr/org/sync` 同步外部组织。2026-07-25 记录的生产快照为 3417 人、2938 人在职且均有姓名、3392 个手机号映射、175 名在职主管和 20 名项目经理;姓名通过稳定 `employee_id` 定向补齐,未执行全量覆盖。当前上游 `employee_number` 与既有主体不一致且手机号大量脱敏,修复契约前禁止强制全量同步;人数属于时点事实,发布或验收前应重新查询。
+2 -1
View File
@@ -294,5 +294,6 @@
- 2026-07-25 完整发布后,生产 H5 已包含手机号/验证码 `tel` 输入修复;使用从生产组织快照只读选择的在职员工手机号完成“请求验证码 → 登录 → 进入员工首页”认证回归。手机号未写入仓库、报告或截图;该回归不替代正式短信或真机验收。 - 2026-07-25 完整发布后,生产 H5 已包含手机号/验证码 `tel` 输入修复;使用从生产组织快照只读选择的在职员工手机号完成“请求验证码 → 登录 → 进入员工首页”认证回归。手机号未写入仓库、报告或截图;该回归不替代正式短信或真机验收。
- 生产服务保持 `AIHR_PRACTICE_RUNTIME_SCHEMA_BOOTSTRAP` 关闭,远端只读 schema 预检为 `64/64`,后端 JAR 与 AIHR 模块哈希和发布源一致;请求仍只能校验结构,不能执行 DDL。 - 生产服务保持 `AIHR_PRACTICE_RUNTIME_SCHEMA_BOOTSTRAP` 关闭,远端只读 schema 预检为 `64/64`,后端 JAR 与 AIHR 模块哈希和发布源一致;请求仍只能校验结构,不能执行 DDL。
- 2026-07-25 15:44:45,源码提交 `acd5fd3a` 增加常规陪练“建议回复”:服务端根据当前回合与教练提示生成可编辑但不自动发送的员工回复,失败时不复制提示。该提交已推送、尚未部署或生产验证。 - 2026-07-25 15:44:45,源码提交 `acd5fd3a` 增加常规陪练“建议回复”:服务端根据当前回合与教练提示生成可编辑但不自动发送的员工回复,失败时不复制提示。该提交已推送、尚未部署或生产验证。
- 2026-07-29,8 月 1 日 `0.1.13 (113)` 候选已在干净提交 `af8af2f6` 完成统一 RC,`releaseEligible=true`;199 项移动端测试、类型检查、H5/App、管理端构建、`ruoyi-aihr` 700 项测试、后端打包和 APK 深检通过,证据在 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`。生产固定码完成首次获取/登录、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录,两次均确认未真实发送短信;该项不再列为缺口。候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD`,生产只读发布计划通过但未获部署授权、未发布。
当前可确认完整包、静态资源、后端模块和 schema 已发布一致;尚未完成主管身份的真实复盘链路、业务内容签字、真机媒体或严格试点,不能称“陪练模块完整交付完成”。 当前只能确认 `0.1.13` 自动化候选已冻结、现网接口兼容且 schema 为 64/64;新后端尚未获授权部署,不能把历史完整包匹配外推为当前候选已上线。正式内容与五通道处理人签认、主管真实复盘、真机媒体和严格试点仍未完成,不能称“陪练模块完整交付完成”。
+5 -5
View File
@@ -333,8 +333,8 @@ Android 人工验收每完成一个步骤,用 `.\scripts\capture-android-accep
```bash ```bash
./scripts/release-backend.sh plan \ ./scripts/release-backend.sh plan \
--artifact backend/ruoyi-admin/target/ruoyi-admin.jar \ --artifact backend/ruoyi-admin/target/ruoyi-admin.jar \
--artifact-commit b9e08789265b73524e3ce2646abe2f2fc4565906 \ --artifact-commit af8af2f6dd169e4616a4ca0ca724e8b809502ab3 \
--expected-sha256 3f9f4506ed138a35f81fa84428be4fbf5981d5d6d0f96ae2769f485d904e1ce3 --expected-sha256 93ad272118f6a28f88c2bfa305f5c450e163cbe22577ff5be3e85b3bd3958dad
``` ```
只有负责人明确授权后,才能把计划输出的 `approval_token` 原样传给 `deploy`;仅运行 `plan` 不构成发布授权: 只有负责人明确授权后,才能把计划输出的 `approval_token` 原样传给 `deploy`;仅运行 `plan` 不构成发布授权:
@@ -342,8 +342,8 @@ Android 人工验收每完成一个步骤,用 `.\scripts\capture-android-accep
```bash ```bash
./scripts/release-backend.sh deploy \ ./scripts/release-backend.sh deploy \
--artifact backend/ruoyi-admin/target/ruoyi-admin.jar \ --artifact backend/ruoyi-admin/target/ruoyi-admin.jar \
--artifact-commit b9e08789265b73524e3ce2646abe2f2fc4565906 \ --artifact-commit af8af2f6dd169e4616a4ca0ca724e8b809502ab3 \
--expected-sha256 3f9f4506ed138a35f81fa84428be4fbf5981d5d6d0f96ae2769f485d904e1ce3 \ --expected-sha256 93ad272118f6a28f88c2bfa305f5c450e163cbe22577ff5be3e85b3bd3958dad \
--approval 'DEPLOY_BACKEND:<完整候选JAR-SHA256>' --approval 'DEPLOY_BACKEND:<完整候选JAR-SHA256>'
``` ```
@@ -366,7 +366,7 @@ Android 人工验收每完成一个步骤,用 `.\scripts\capture-android-accep
./scripts/verify-aug1-production-api-readonly.sh ./scripts/verify-aug1-production-api-readonly.sh
``` ```
冻结运行时产物后,如发布/回滚或验收工具继续修正,不要重编同版本 APK/JAR 冒充新运行时。当前打包器默认使用 `b9e08789` 的 `0.1.12 (112)` 统一 RC 证据,并把当前干净 `HEAD` 作为 operations commit;新包名同时包含两者短哈希,旧 ZIP 不覆盖: 冻结运行时产物后,如发布/回滚或验收工具继续修正,不要重编同版本 APK/JAR 冒充新运行时。当前打包器默认使用 `af8af2f6` 的 `0.1.13 (113)` 统一 RC 证据,并把当前干净 `HEAD` 作为 operations commit;新包名同时包含两者短哈希,旧 ZIP 不覆盖:
```powershell ```powershell
.\scripts\package-aug1-release.ps1 ` .\scripts\package-aug1-release.ps1 `
+2 -2
View File
@@ -44,7 +44,7 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
2026-07-29 又以新增的只读统一取证脚本复核同一虚拟机的当前状态:前台 Activity 为 `io.dcloud.PandoraEntryActivity`,原生隐私标题、“暂不同意”和“同意并继续”三个控件均可见,手机号登录尚不可见;相机、录音、图片和视频权限仍为 `false`,应用退出记录中未出现 Crash/ANR。截图、UI、权限、Activity、退出记录和 JSON 均落在忽略目录 `output/aug1-rc/android-acceptance/20260728-192056-privacy-before-choice/`。该次只记录选择前基线,仍未代替用户做隐私选择。 2026-07-29 又以新增的只读统一取证脚本复核同一虚拟机的当前状态:前台 Activity 为 `io.dcloud.PandoraEntryActivity`,原生隐私标题、“暂不同意”和“同意并继续”三个控件均可见,手机号登录尚不可见;相机、录音、图片和视频权限仍为 `false`,应用退出记录中未出现 Crash/ANR。截图、UI、权限、Activity、退出记录和 JSON 均落在忽略目录 `output/aug1-rc/android-acceptance/20260728-192056-privacy-before-choice/`。该次只记录选择前基线,仍未代替用户做隐私选择。
2026-07-29 当前非自定义基座内测 APK 已升级为 `0.1.13 (113)`,大小 `33,921,543` 字节,SHA-256 为 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`。DCloud 云端证书打包成功,APK 深检通过包名、API 35、v2 测试签名、登录页法务门禁、身份失败关闭、包内资源一致性、敏感值和禁止明文 HTTP。生产固定码的首次获取/登录、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录已在非真机认证脚本中通过,两次验证码请求均确认未真实发送短信;这不替代本文件下列 Android 真机权限、系统选择器、前后台、弱网、附件和媒体链路验收。 2026-07-29 当前非自定义基座内测 APK 已升级为 `0.1.13 (113)`,大小 `33,921,543` 字节,SHA-256 为 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`。DCloud 云端证书打包成功,APK 深检通过包名、API 35、v2 测试签名、登录页法务门禁、身份失败关闭、包内资源一致性、敏感值和禁止明文 HTTP。干净提交 `af8af2f6` 的统一 RC 已达到 `releaseEligible=true`。生产固定码的首次获取/登录、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录已在非真机认证脚本中通过,两次验证码请求均确认未真实发送短信;固定码认证不再列为功能缺口,这不替代本文件下列 Android 真机权限、系统选择器、前后台、弱网、附件和媒体链路验收。
随后根据企业内部应用的体验决策,`0.1.12 (112)` 取消 DCloud 启动原生确认,法务同意统一放到登录页。新 APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`;包体门禁确认 `prompt=none`、登录页两个 HTTPS 链接和未勾选拦截均已内置。在同一 Android 15/API 35 虚拟机卸载旧包后全新安装,取证结果为原生隐私层 `not-visible`、四项敏感权限未授权、进程与前台 Activity 正常且无 Crash/ANR,证据位于 `output/aug1-rc/android-acceptance/20260729-021418-no-native-privacy-fresh-install-retry/`。当前 AVD 是 `x86_64`,而 APK 只含 `arm64-v8a/armeabi-v7a`;DCloud Weex 跨架构转译实际报 `spinWaitPeer timeout`、`sender is null` 和 IPC timeout,所以原生外壳可见但页面主体空白。该现象不证明产品页面失败,也不能作为页面通过证据;不得为此修改正式 ABI、回退 H5 壳或增加业务兜底。 随后根据企业内部应用的体验决策,`0.1.12 (112)` 取消 DCloud 启动原生确认,法务同意统一放到登录页。新 APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`;包体门禁确认 `prompt=none`、登录页两个 HTTPS 链接和未勾选拦截均已内置。在同一 Android 15/API 35 虚拟机卸载旧包后全新安装,取证结果为原生隐私层 `not-visible`、四项敏感权限未授权、进程与前台 Activity 正常且无 Crash/ANR,证据位于 `output/aug1-rc/android-acceptance/20260729-021418-no-native-privacy-fresh-install-retry/`。当前 AVD 是 `x86_64`,而 APK 只含 `arm64-v8a/armeabi-v7a`;DCloud Weex 跨架构转译实际报 `spinWaitPeer timeout`、`sender is null` 和 IPC timeout,所以原生外壳可见但页面主体空白。该现象不证明产品页面失败,也不能作为页面通过证据;不得为此修改正式 ABI、回退 H5 壳或增加业务兜底。
@@ -69,7 +69,7 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
## Android(最低 Android 10 + 一台当前主流机型) ## Android(最低 Android 10 + 一台当前主流机型)
- [ ] 登录页协议默认未勾选;两个法务链接能打开正确正文;未勾选时验证码和登录均不发请求,勾选后才允许继续。 - [ ] 登录页协议默认未勾选;两个法务链接能打开正确正文;未勾选时验证码和登录均不发请求,勾选后才允许继续。
- [ ] 手机号登录、短信验证码错误、登录失效重登均符合预期。 - [ ] 在 Android 设备选择数据库现有有效手机号,点击获取验证码后使用生产固定码登录;不得开启真实短信。首次登录、退出、旧令牌失效及重新获取/登录的非真机链路已通过,本项只剩设备页面操作。
- [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。 - [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。
- [ ] 原生实时对练可完成麦克风授权、实时转写与远端语音播放;WebRTC/WebView 不可用或断线时明确提示并保留录音对练。 - [ ] 原生实时对练可完成麦克风授权、实时转写与远端语音播放;WebRTC/WebView 不可用或断线时明确提示并保留录音对练。
- [ ] 图片、视频、文档和音频可选择并上传;受控附件下载后可打开,不泄露 OSS 地址。 - [ ] 图片、视频、文档和音频可选择并上传;受控附件下载后可打开,不泄露 OSS 地址。
+1 -1
View File
@@ -80,7 +80,7 @@ APK 门禁还会比较包内与当前 `dist/build/app/app-service.js` 的 SHA-25
脚本会复跑移动端测试/类型检查/H5/App 构建、管理端构建、后端定向测试和打包,验证 APK 后在被 Git 忽略的 `output/aug1-rc/` 生成标准文件名、哈希及 JSON/Markdown 证据。它不执行生产同步、数据库迁移、服务重启或登录页人工同意操作。 脚本会复跑移动端测试/类型检查/H5/App 构建、管理端构建、后端定向测试和打包,验证 APK 后在被 Git 忽略的 `output/aug1-rc/` 生成标准文件名、哈希及 JSON/Markdown 证据。它不执行生产同步、数据库迁移、服务重启或登录页人工同意操作。
2026-07-28 最终自定义基座大小为 `21,158,193` 字节,SHA-256 为 `82D3352FF96A86F5DB4AC0C71DCB0ED6CEC98F2A785F6EAED2FE8D4FC0C5F704`。2026-07-29 当前独立内测候选包为 `bangdao-0.1.13-dcloud-test.apk`:包名 `com.yincheng.wygj`、版本 `0.1.13 (113)`、`targetSdkVersion=35`,大小 `33,921,543` 字节,SHA-256 为 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,签名证书 SHA-256 为 `AB06ECC0DE544DE73C385F3F0690B22966EBC12887FB8BEE1830CDBEFDEBEF5D`。APK 反编译门禁确认包内业务资源等于当前 App-Plus 编译产物、启动原生隐私提示已关闭、登录页法务链接与未勾选拦截及身份加载失败关闭已进入包体,并通过敏感值、`usesCleartextTraffic=false`、`networkSecurityConfig` 和系统证书信任检查。`0.1.12` 及其 RC/交付 ZIP 只保留为上一冻结基线;`0.1.13` 仍须在干净提交上完成统一 RC 才能标记为新冻结候选。当前 AVD 为 `x86_64`,APK 原生库仅含 `arm64-v8a/armeabi-v7a`;安装和原生外壳可由系统转译运行,但 DCloud Weex JS 进程实际出现 `spinWaitPeer`/IPC 超时,页面主体空白不能用于判断产品页面。浏览器验证只作补充,不替代 App 运行;不会为了模拟器改变正式 ABI、回退为 H5 壳或增加业务兜底。该包仍使用 DCloud 云端测试证书,只能作为 8 月 1 日受控内测包;企业正式 release 还必须使用签认后的企业证书摘要。 2026-07-28 最终自定义基座大小为 `21,158,193` 字节,SHA-256 为 `82D3352FF96A86F5DB4AC0C71DCB0ED6CEC98F2A785F6EAED2FE8D4FC0C5F704`。2026-07-29 当前独立内测候选包为 `bangdao-0.1.13-dcloud-test.apk`:包名 `com.yincheng.wygj`、版本 `0.1.13 (113)`、`targetSdkVersion=35`,大小 `33,921,543` 字节,SHA-256 为 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`,签名证书 SHA-256 为 `AB06ECC0DE544DE73C385F3F0690B22966EBC12887FB8BEE1830CDBEFDEBEF5D`。APK 反编译门禁确认包内业务资源等于当前 App-Plus 编译产物、启动原生隐私提示已关闭、登录页法务链接与未勾选拦截及身份加载失败关闭已进入包体,并通过敏感值、`usesCleartextTraffic=false`、`networkSecurityConfig` 和系统证书信任检查。干净提交 `af8af2f6dd169e4616a4ca0ca724e8b809502ab3` 的统一 RC 已完成,`releaseEligible=true`,证据在 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`;候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD`。`0.1.12` 及其 RC/交付 ZIP 只保留为上一冻结基线。当前 AVD 为 `x86_64`,APK 原生库仅含 `arm64-v8a/armeabi-v7a`;安装和原生外壳可由系统转译运行,但 DCloud Weex JS 进程实际出现 `spinWaitPeer`/IPC 超时,页面主体空白不能用于判断产品页面。浏览器验证只作补充,不替代 App 运行;不会为了模拟器改变正式 ABI、回退为 H5 壳或增加业务兜底。该包仍使用 DCloud 云端测试证书,只能作为 8 月 1 日受控内测包;企业正式 release 还必须使用签认后的企业证书摘要。
企业正式签名 APK 还必须用发布负责人保管的证书摘要执行 release 模式核验;该模式会额外拒绝 `debuggable=true`、明文 HTTP 和签名摘要不一致: 企业正式签名 APK 还必须用发布负责人保管的证书摘要执行 release 模式核验;该模式会额外拒绝 `debuggable=true`、明文 HTTP 和签名摘要不一致:
@@ -1,6 +1,6 @@
# 帮道 8 月 1 日 Android 内测 Go/No-Go # 帮道 8 月 1 日 Android 内测 Go/No-Go
> 评估时间:2026-07-29 11:52(CST) > 评估时间:2026-07-29 12:20(CST)
> >
> 评估对象:2026-08-01 受控内部测试 APK,不代表正式发布、应用商店上架或阶段一严格试点验收。 > 评估对象:2026-08-01 受控内部测试 APK,不代表正式发布、应用商店上架或阶段一严格试点验收。
> >
@@ -10,15 +10,15 @@
**当前为 No-Go,暂不能把现有 APK 标记为 8 月 1 日可分发版本。** **当前为 No-Go,暂不能把现有 APK 标记为 8 月 1 日可分发版本。**
`0.1.13` DCloud 云端证书 APK 已生成并通过深检,加入认证身份失败关闭和可重复固定码重新登录门禁;还需在干净提交上完成统一 RC 冻结。阻断点集中在生产后端未更新、正式业务内容/处理人签认、发布授权和真机设备验收,而不是 HBuilderX 或 DCloud 打包本身。 `0.1.13` DCloud 云端证书 APK 已生成并通过深检,认证身份失败关闭和可重复固定码重新登录门禁已进入包体;干净提交 `af8af2f6` 的统一 RC 已达到 `releaseEligible=true`,新候选后端的生产只读发布计划也已通过。固定码、登录和重新登录不再是缺口;当前阻断点只剩生产后端发布授权与发布后匹配、正式业务内容/五通道处理人签认、企业发布签认,以及本轮明确暂缓的真机设备验收。
## 已通过 ## 已通过
| 检查项 | 当前结果 | | 检查项 | 当前结果 |
|---|---| |---|---|
| 当前运行时冻结 | `0.1.13 (113)` APK 已生成并通过深检,但尚未在干净提交上完成统一 RC;因此最后一个 `releaseEligible=true` 的历史冻结仍是 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`,不能把其提交或后端 JAR 哈希写成 `0.1.13` 证据 | | 当前运行时冻结 | 干净提交 `af8af2f6dd169e4616a4ca0ca724e8b809502ab3` 的 `0.1.13 (113)` 统一 RC 已完成,`releaseEligible=true`;证据目录为 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`,候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD` |
| 移动端自动化 | 199 项单元测试通过;TypeScript 类型检查通过;登录页协议默认未勾选,法务链接、验证码和登录共用失败关闭门禁;五个文件选择器和九个消费页面已覆盖用户取消/平台失败分流,直通车首次弱网加载失败可原位重试并失败关闭 | | 移动端自动化 | 199 项单元测试通过;TypeScript 类型检查通过;登录页协议默认未勾选,法务链接、验证码和登录共用失败关闭门禁;五个文件选择器和九个消费页面已覆盖用户取消/平台失败分流,直通车首次弱网加载失败可原位重试并失败关闭 |
| 构建 | `mobile-uni` H5、App-Plus、管理端生产构建通过;后端 `ruoyi-admin.jar` 重建通过 | | 构建 | `mobile-uni` H5、App-Plus、管理端生产构建通过;后端 `ruoyi-admin.jar` 重建通过;统一 RC 的前端、移动 H5 和后端 JAR 哈希均已写入冻结证据 |
| P0 后端语义 | `AihrSopSeedServiceTest` 39 项、`AihrPracticeSeedServiceTest` 102 项通过;`ruoyi-aihr` 700 项全量测试通过,0 失败、0 错误;新增 2 项覆盖有效主管身份与空身份失败关闭 | | P0 后端语义 | `AihrSopSeedServiceTest` 39 项、`AihrPracticeSeedServiceTest` 102 项通过;`ruoyi-aihr` 700 项全量测试通过,0 失败、0 错误;新增 2 项覆盖有效主管身份与空身份失败关闭 |
| 内容候选门禁 | 已生成 5 个禁用场景候选和 30 道待审政策题,机器校验通过;正式可发布场景 `0`、正式有据标准答案 `0`,不得导入或启用 | | 内容候选门禁 | 已生成 5 个禁用场景候选和 30 道待审政策题,机器校验通过;正式可发布场景 `0`、正式有据标准答案 `0`,不得导入或启用 |
| App 资源门禁 | 正式法务 URL、登录页同意门禁、原生 `prompt=none`、API 35、图标和启动图检查通过 | | App 资源门禁 | 正式法务 URL、登录页同意门禁、原生 `prompt=none`、API 35、图标和启动图检查通过 |
@@ -31,13 +31,13 @@
| 生产固定码认证 | 运行时确认固定码和生产显式开关同时启用;生产应用日志确认首次和重新登录前的两次验证码请求均命中“未真实发送短信”分支。只选择已存在 `app_user` 的双向唯一在职主体,不触发自动注册,不输出手机号、固定码或令牌 | | 生产固定码认证 | 运行时确认固定码和生产显式开关同时启用;生产应用日志确认首次和重新登录前的两次验证码请求均命中“未真实发送短信”分支。只选择已存在 `app_user` 的双向唯一在职主体,不触发自动注册,不输出手机号、固定码或令牌 |
| 认证后非真机主路径 | `scripts/verify-aug1-authenticated-production.sh --execute` 通过身份/非空项目范围、认证首页、训练历史/画像、五通道、我的反馈、大喇叭、考试、案例/全网能力只读入口、退出、旧令牌业务码 401、防刷窗口后的再次获取、重新登录、重新读取身份和再次退出;五通道返回数为 5。未提交业务写入、附件、ASR/TTS 或 Agent 请求 | | 认证后非真机主路径 | `scripts/verify-aug1-authenticated-production.sh --execute` 通过身份/非空项目范围、认证首页、训练历史/画像、五通道、我的反馈、大喇叭、考试、案例/全网能力只读入口、退出、旧令牌业务码 401、防刷窗口后的再次获取、重新登录、重新读取身份和再次退出;五通道返回数为 5。未提交业务写入、附件、ASR/TTS 或 Agent 请求 |
| 法务静态页 | `https://peilian.njzhmj.top/legal/terms.html` 与 `https://peilian.njzhmj.top/legal/privacy.html` 已部署并可访问;发布前站点备份为 `/opt/wygj/backups/www-20260728224710` | | 法务静态页 | `https://peilian.njzhmj.top/legal/terms.html` 与 `https://peilian.njzhmj.top/legal/privacy.html` 已部署并可访问;发布前站点备份为 `/opt/wygj/backups/www-20260728224710` |
| 生产 API 只读契约 | 对 `0.1.12` 冻结候选,线上与包内 9 个关键控制器 class 哈希逐一相同;当前 `0.1.13` 源码已修改 `AihrMobileController`,使登录身份与组织异常失败关闭,因此该“逐字节相同”结论不再适用于新后端候选。可重复 GET-only 探针仍覆盖 20 个 APK 入口;固定码认证脚本另完成认证后只读主路径 | | 生产 API 只读契约 | 可重复 GET-only 探针覆盖 20 个 APK 入口;固定码认证脚本另完成认证后只读主路径。`0.1.13` 新后端候选包含 `AihrMobileController` 身份失败关闭修复,现网后端仍为上一语义,因此只读兼容通过不代表新候选已部署匹配 |
| 定向发布预检 | `566f222e` 已支持只核对后端 + schema;`feece9bb` 进一步允许以冻结提交和解压后的候选 JAR 为准。两次实际只读运行均跳过管理端/H5,根站、租户、移动首页和生产禁 DDL 门禁通过;后端 + schema 模式另通过 64/64 schema。冻结物模式确认本地 JAR SHA-256 为 `8c676f2f…`,最终均仅因现网/候选模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败 | | 定向发布预检 | `566f222e` 已支持只核对后端 + schema;`feece9bb` 进一步允许以冻结提交和解压后的候选 JAR 为准。两次实际只读运行均跳过管理端/H5,根站、租户、移动首页和生产禁 DDL 门禁通过;后端 + schema 模式另通过 64/64 schema。冻结物模式确认本地 JAR SHA-256 为 `8c676f2f…`,最终均仅因现网/候选模块哈希 `15f5513a…` / `c93460e8…` 不同而按预期失败 |
| 后端发布/回滚计划 | `release-backend.sh` 固定生产 JAR 与 systemd 服务,默认只读,部署/回滚分别要求完整哈希授权串和干净工作区;备份、原子切换、发布后预检、失败恢复及并发改包保护均有回归。当前 `b9e08789` 候选 JAR 实跑只读计划通过:候选 `3f9f4506…`、现网 `46c99cff…`,服务 active、空间充足、三个公开入口、64/64 schema 和生产禁 DDL 通过,全程未备份、上传、重启或改库 | | 后端发布/回滚计划 | `release-backend.sh` 固定生产 JAR 与 systemd 服务,默认只读,部署/回滚分别要求完整哈希授权串和干净工作区;备份、原子切换、发布后预检、失败恢复及并发改包保护均有回归。`af8af2f6` 候选 JAR 实跑只读计划通过:候选 `93ad2721…`、现网 `46c99cff…`,服务 active、空间充足、三个公开入口、64/64 schema 和生产禁 DDL 通过,全程未备份、上传、重启或改库 |
## No-Go 阻断项 ## No-Go 阻断项
1. **生产接口兼容,但当前后端修复未部署。** 生产固定码登录和现有认证只读接口可用,根站、租户接口、移动首页和 64/64 schema 门禁此前通过;当前源码除“不得冒充已创建/派发工单”和场景发布门禁外,又让移动身份缺失、组织查询异常、无在职身份和后台账号访问员工首页失败关闭。新后端 JAR 尚未冻结、发布或完成发布后匹配,生产仍保留旧语义;获得单独授权前不得部署。管理端和移动 H5 不属于独立 APK 本轮必发单元,schema 本批不变。 1. **生产接口兼容,但当前后端修复未部署。** 生产固定码登录和现有认证只读接口可用,根站、租户接口、移动首页和 64/64 schema 门禁通过;当前源码除“不得冒充已创建/派发工单”和场景发布门禁外,又让移动身份缺失、组织查询异常、无在职身份和后台账号访问员工首页失败关闭。新后端 JAR 已冻结且只读发布计划通过,但尚无部署授权或发布后模块匹配结果,生产仍保留旧语义;获得单独授权前不得部署。管理端和移动 H5 不属于独立 APK 本轮必发单元,schema 本批不变。
2. **剩余认证问题已收敛为真机设备能力。** 固定码首次请求、登录、退出、旧令牌失效、等待防刷窗口后的再次请求和重新登录均已通过,两次请求都由日志确认没有真实短信发送。尚未完成的麦克风允许/拒绝、真实系统选择器取消、App 前后台和真实断网恢复均属于 Android 真机门禁,不能用 H5 结果代替。 2. **剩余认证问题已收敛为真机设备能力。** 固定码首次请求、登录、退出、旧令牌失效、等待防刷窗口后的再次请求和重新登录均已通过,两次请求都由日志确认没有真实短信发送。尚未完成的麦克风允许/拒绝、真实系统选择器取消、App 前后台和真实断网恢复均属于 Android 真机门禁,不能用 H5 结果代替。
3. **核心业务的非写入认证入口已通过,正式业务闭环仍受内容和处理人阻断。** 认证账号下身份、项目范围、首页、训练历史/画像、五通道列表、我的反馈、大喇叭、考试、案例和全网能力只读入口均已通过;正式“练”仍没有可发布的 5 个场景,五通道仍没有真实收件人,附件和 ASR/TTS 仍属真机/媒体验收。不得通过创建测试内容或绑定任意用户制造假闭环。 3. **核心业务的非写入认证入口已通过,正式业务闭环仍受内容和处理人阻断。** 认证账号下身份、项目范围、首页、训练历史/画像、五通道列表、我的反馈、大喇叭、考试、案例和全网能力只读入口均已通过;正式“练”仍没有可发布的 5 个场景,五通道仍没有真实收件人,附件和 ASR/TTS 仍属真机/媒体验收。不得通过创建测试内容或绑定任意用户制造假闭环。
4. **内容与业务验收不足。** 当前仅收到 1/24 份生活顾问访谈。技术侧已把调研整理为 30 道政策题候选和 5 个场景候选,并提供统一签认单,但全部保持待审/禁用,正式可发布场景和正式有据标准答案仍为 0/0。生产只读审计确认 `direct_president/direct_finance/direct_hr/direct_audit/direct_operations` 五个角色的有效用户绑定数均为 0,必须由业务负责人指定主处理人和替补后再验收。 4. **内容与业务验收不足。** 当前仅收到 1/24 份生活顾问访谈。技术侧已把调研整理为 30 道政策题候选和 5 个场景候选,并提供统一签认单,但全部保持待审/禁用,正式可发布场景和正式有据标准答案仍为 0/0。生产只读审计确认 `direct_president/direct_finance/direct_hr/direct_audit/direct_operations` 五个角色的有效用户绑定数均为 0,必须由业务负责人指定主处理人和替补后再验收。
@@ -48,7 +48,8 @@
| 顺序 | 必须完成 | 验收证据 | | 顺序 | 必须完成 | 验收证据 |
|---|---|---| |---|---|---|
| 已完成 | 确定 APK、后端、管理端/H5、数据库四个发布单元并生成 `0.1.13` DCloud 云端证书 APK | `0.1.13 (113)` APK SHA-256 `FA2D2A6D…`,API 35、v2 测试签名和深检通过;`0.1.12` ZIP 只作上一冻结基线 | | 已完成 | 确定 APK、后端、管理端/H5、数据库四个发布单元并生成 `0.1.13` DCloud 云端证书 APK | `0.1.13 (113)` APK SHA-256 `FA2D2A6D…`,API 35、v2 测试签名和深检通过;`0.1.12` ZIP 只作上一冻结基线 |
| 1 | 在干净提交上冻结 `0.1.13` APK 与后端 JAR;获得明确授权后才使用 `release-backend.sh deploy` 发布内容语义和移动身份失败关闭修复;管理端/H5 延期,schema 本批不变 | 新 RC `releaseEligible=true`、新候选 JAR 哈希、只读发布计划、备份目录、生产 `ruoyi-aihr` 模块匹配和 64/64 schema;不得手工覆盖或绕过失败恢复 | | 已完成 | 在干净提交上冻结 `0.1.13` APK 与后端 JAR,并执行生产只读发布计划 | `releaseEligible=true`,冻结目录 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`;候选 JAR `93AD2721…`、现网 JAR `46C99CFF…`,64/64 schema;未部署、未重启、未改库 |
| 1 | 获得明确授权后才使用 `release-backend.sh deploy` 发布内容语义和移动身份失败关闭修复;管理端/H5 延期,schema 本批不变 | 远端备份目录、生产 `ruoyi-aihr` 模块匹配、64/64 schema、发布后固定码认证与回滚点;不得手工覆盖或绕过失败恢复 |
| 已完成 | 使用生产现有在职 APP 主体和固定码完成非真机认证、退出、重新获取、重新登录及认证后只读主路径;固定码请求不真实发送短信 | `scripts/verify-aug1-authenticated-production.sh --execute` 全部通过,五通道数为 5,旧令牌按业务码 401 拒绝,两次验证码请求均有“未真实发送”日志;执行过程不输出手机号、固定码或令牌 | | 已完成 | 使用生产现有在职 APP 主体和固定码完成非真机认证、退出、重新获取、重新登录及认证后只读主路径;固定码请求不真实发送短信 | `scripts/verify-aug1-authenticated-production.sh --execute` 全部通过,五通道数为 5,旧令牌按业务码 401 拒绝,两次验证码请求均有“未真实发送”日志;执行过程不输出手机号、固定码或令牌 |
| 2 | 业务方按统一签认单审核 30 道题和 5 个场景候选,补齐正式来源;同时指定五渠道主处理人和替补 | [业务内容与五通道签认单](帮道8月1日业务内容与五通道签认单-20260729.md)、正式内容版本、授权矩阵;正式可发布计数从 0/0 提升到至少 5/30,五个角色有效绑定均不少于 2 | | 2 | 业务方按统一签认单审核 30 道题和 5 个场景候选,补齐正式来源;同时指定五渠道主处理人和替补 | [业务内容与五通道签认单](帮道8月1日业务内容与五通道签认单-20260729.md)、正式内容版本、授权矩阵;正式可发布计数从 0/0 提升到至少 5/30,五个角色有效绑定均不少于 2 |
| 3 | 绑定获批处理人后完成五通道正例、跨通道反例和一次正式回复;用正式内容完成“查/练/问”业务写入闭环 | 每条用例的时间、角色、结果和脱敏证据;不记录手机号、验证码或反馈正文 | | 3 | 绑定获批处理人后完成五通道正例、跨通道反例和一次正式回复;用正式内容完成“查/练/问”业务写入闭环 | 每条用例的时间、角色、结果和脱敏证据;不记录手机号、验证码或反馈正文 |
@@ -62,7 +62,7 @@
- 直通车已经支持五通道、业务匿名、按角色收件和一次正式回复。 - 直通车已经支持五通道、业务匿名、按角色收件和一次正式回复。
- 生产短音频 ASR 已切换到阿里云百炼 `qwen3-asr-flash`,并在一台 Android 标准基座完成过“按住说话→转写→提交”验证。 - 生产短音频 ASR 已切换到阿里云百炼 `qwen3-asr-flash`,并在一台 Android 标准基座完成过“按住说话→转写→提交”验证。
当前短板主要是:正式内容、生产授权配置、企业签名 RC APK、完整真机反例、当前代码完整发布以及受控内测证据。API 35 自定义基座链路已成立,但不能替代企业签名包或正式试点。 当前短板主要是:正式内容、五通道真实处理人、生产后端部署授权与发布后匹配、企业签名/法务签认,以及本轮明确暂缓的完整真机反例。`0.1.13` 受控内测 APK、统一 RC、固定码认证和生产只读发布计划已经完成;API 35 自定义基座链路已成立,但不能替代企业签名包或正式试点。
### 3.1 生产只读基线(2026-07-27) ### 3.1 生产只读基线(2026-07-27)
@@ -109,7 +109,7 @@
2026-07-29 根据企业内部应用体验决策,当前候选升级为 `0.1.12 (112)`,取消启动原生隐私确认,法务同意统一由登录页协议勾选承担。干净提交 `b9e08789265b73524e3ce2646abe2f2fc4565906` 的统一 RC 证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`,结果为 `releaseEligible=true`;移动端 199 项、`ruoyi-aihr` 698 项及全部构建、APK 门禁通过。APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`。以 operations commit `6bf365d5911fbe982ba059b1b4388d9692c989db` 生成的新双提交包为 `output/aug1-release/bangdao-aug1-0.1.12-112-b9e08789-ops6bf365d5.zip`,大小 `192,926,061` 字节,SHA-256 为 `E8014A0C5BD56B66B198710E75E2B8DDEC86002D1E3BC6CAF56FB3454A199C33`,14 个 ZIP 条目和内部哈希已逐条复验。包内候选后端 JAR SHA-256 为 `3F9F4506ED138A35F81FA84428BE4FBF5981D5D6D0F96AE2769F485D904E1CE3`,生产只读发布计划通过目标、服务、公开入口、64/64 schema 和生产禁 DDL 检查;现网 JAR 哈希仍不同,未执行发布。前述 `0.1.10` 双提交包仅保留追溯,不能再作为当前 APK 分发。 2026-07-29 根据企业内部应用体验决策,当前候选升级为 `0.1.12 (112)`,取消启动原生隐私确认,法务同意统一由登录页协议勾选承担。干净提交 `b9e08789265b73524e3ce2646abe2f2fc4565906` 的统一 RC 证据位于 `output/aug1-rc/0.1.12-112-b9e08789-frozen/`,结果为 `releaseEligible=true`;移动端 199 项、`ruoyi-aihr` 698 项及全部构建、APK 门禁通过。APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`。以 operations commit `6bf365d5911fbe982ba059b1b4388d9692c989db` 生成的新双提交包为 `output/aug1-release/bangdao-aug1-0.1.12-112-b9e08789-ops6bf365d5.zip`,大小 `192,926,061` 字节,SHA-256 为 `E8014A0C5BD56B66B198710E75E2B8DDEC86002D1E3BC6CAF56FB3454A199C33`,14 个 ZIP 条目和内部哈希已逐条复验。包内候选后端 JAR SHA-256 为 `3F9F4506ED138A35F81FA84428BE4FBF5981D5D6D0F96AE2769F485D904E1CE3`,生产只读发布计划通过目标、服务、公开入口、64/64 schema 和生产禁 DDL 检查;现网 JAR 哈希仍不同,未执行发布。前述 `0.1.10` 双提交包仅保留追溯,不能再作为当前 APK 分发。
同日当前源码候选继续升级为 `0.1.13 (113)`:认证身份、组织角色和岗位加载异常改为失败关闭,不再回退普通员工、陈旧岗位或公开首页;生产固定码的首次获取/登录、退出、旧令牌拒绝、等待防刷窗口后的再次获取和重新登录完整通过,两次请求均确认未真实发送短信。移动端 199 项、`ruoyi-aihr` 700 项和 App-Plus 资源门禁通过。`0.1.13` 新 APK、后端 JAR、统一 RC 和交付 ZIP 必须另行冻结;在新证据完成前,上一 `0.1.12` 仍是最后一个已冻结安装包,不得把旧哈希写成新源码的证据。 同日当前源码候选继续升级为 `0.1.13 (113)`:认证身份、组织角色和岗位加载异常改为失败关闭,不再回退普通员工、陈旧岗位或公开首页;生产固定码的首次获取/登录、退出、旧令牌拒绝、等待防刷窗口后的再次获取和重新登录完整通过,两次请求均确认未真实发送短信。干净提交 `af8af2f6dd169e4616a4ca0ca724e8b809502ab3` 的统一 RC 已完成,证据位于 `output/aug1-rc/0.1.13-113-af8af2f6-frozen/`,`releaseEligible=true`;移动端 199 项、`ruoyi-aihr` 700 项、类型检查、H5/App、管理端构建、后端打包和 APK 深检通过。候选后端 JAR SHA-256 为 `93AD272118F6A28F88C2BFA305F5C450E163CBE22577FF5BE3E85B3BD3958DAD`,生产只读发布计划通过但未执行部署。`0.1.12` 及更早安装包/交付 ZIP 只作历史追溯,不再作为当前候选。
生活顾问调研已转成 `docs/content-candidates/aug1-life-advisor-content-candidates-v0.1.json`:包含 5 个禁用场景候选和 30 道待审政策题,内容候选校验脚本通过。由于当前只收到 1/24 份访谈,且正式来源、业务审核和 Rubric 签认尚未完成,正式可发布场景与正式有据标准答案均为 `0`;交付包中的候选文件只供审核,不得直接导入或启用。 生活顾问调研已转成 `docs/content-candidates/aug1-life-advisor-content-candidates-v0.1.json`:包含 5 个禁用场景候选和 30 道待审政策题,内容候选校验脚本通过。由于当前只收到 1/24 份访谈,且正式来源、业务审核和 Rubric 签认尚未完成,正式可发布场景与正式有据标准答案均为 `0`;交付包中的候选文件只供审核,不得直接导入或启用。
+11 -7
View File
@@ -1,13 +1,13 @@
[CmdletBinding()] [CmdletBinding()]
param( param(
[string]$EvidenceDirectory = 'output\aug1-rc\0.1.12-112-b9e08789-frozen', [string]$EvidenceDirectory = 'output\aug1-rc\0.1.13-113-af8af2f6-frozen',
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
[string]$BackendJar, [string]$BackendJar,
[string]$ContentCandidate = 'docs\content-candidates\aug1-life-advisor-content-candidates-v0.1.json', [string]$ContentCandidate = 'docs\content-candidates\aug1-life-advisor-content-candidates-v0.1.json',
[string]$RuntimeCommit = 'b9e08789265b73524e3ce2646abe2f2fc4565906', [string]$RuntimeCommit = 'af8af2f6dd169e4616a4ca0ca724e8b809502ab3',
[string]$OperationsCommit = 'HEAD', [string]$OperationsCommit = 'HEAD',
@@ -189,7 +189,7 @@ try {
"- Runtime commit: $runtimeCommitSha (unchanged APK/JAR)", "- Runtime commit: $runtimeCommitSha (unchanged APK/JAR)",
"- Operations commit: $operationsCommitSha (deploy, rollback, API and Android evidence tools)", "- Operations commit: $operationsCommitSha (deploy, rollback, API and Android evidence tools)",
'- Automated candidate: `releaseEligible=true`', '- Automated candidate: `releaseEligible=true`',
'- Current decision: **No-Go**; manual privacy/permission, authenticated business, content and authorization gates remain.', '- Current decision: **No-Go**; Android device permission/write/media, formal content/handler, production authorization and enterprise sign-off gates remain.',
'', '',
'## Core artifacts', '## Core artifacts',
'', '',
@@ -205,7 +205,7 @@ try {
'', '',
'Run the versioned release script from a clean checkout of the operations commit. The ZIP operations folder is an audit snapshot and must not be executed outside repository context. Run read-only plan first; deploy only after separate explicit authorization. Do not manually overwrite the JAR.', 'Run the versioned release script from a clean checkout of the operations commit. The ZIP operations folder is an audit snapshot and must not be executed outside repository context. Run read-only plan first; deploy only after separate explicit authorization. Do not manually overwrite the JAR.',
'', '',
'Run the GET-only API probe before and after release, and capture read-only Android evidence after each manual step. Neither replaces the user privacy choice or authenticated business acceptance.', 'Run the GET-only API probe before and after release, and capture read-only Android evidence after each manual step. Neither replaces Android device acceptance or formal business sign-off.',
'', '',
'This package does not authorize production deployment, service restart, database change, Git push or public distribution.' 'This package does not authorize production deployment, service restart, database change, Git push or public distribution.'
) -join [Environment]::NewLine ) -join [Environment]::NewLine
@@ -215,13 +215,14 @@ try {
'# August 1 production preflight summary', '# August 1 production preflight summary',
'', '',
"- Generated from operations commit: $operationsCommitSha", "- Generated from operations commit: $operationsCommitSha",
'- Check type: read-only; no deployment, restart, database mutation, SMS request, login, upload or static sync.', '- Check type: read-only deploy plan; no deployment, restart, database mutation, SMS request, login, upload or static sync.',
'- Backend deploy plan: passed for the frozen JAR.', '- Backend deploy plan: passed for the frozen JAR.',
"- Candidate JAR SHA-256: $backendSha256", "- Candidate JAR SHA-256: $backendSha256",
'- Current production JAR SHA-256: `46c99cff75d21f8536a71c3c058b6437e99dbf9ff4bae3542b44471f3f34ad84`', '- Current production JAR SHA-256: `46c99cff75d21f8536a71c3c058b6437e99dbf9ff4bae3542b44471f3f34ad84`',
'- Production service: `wygj-aihr.service` active and starts the fixed JAR path.', '- Production service: `wygj-aihr.service` active and starts the fixed JAR path.',
'- Production schema: 64/64 and runtime schema bootstrap disabled/default.', '- Production schema: 64/64 and runtime schema bootstrap disabled/default.',
'- Production GET-only route probe: 20/20 (`1x200`, `6x401`, `13x405`).', '- Production GET-only route probe: 20/20 (`1x200`, `6x401`, `13x405`).',
'- Separate fixed-code authenticated smoke passed request/login, read-only business routes, logout, old-token rejection and re-login; application logs confirmed that no real SMS was sent.',
'- Backend normalized AIHR module remains mismatched until an authorized deploy.', '- Backend normalized AIHR module remains mismatched until an authorized deploy.',
'- Overall result: **No-Go** pending the manual and authorization gates in `operations/go-no-go.md`.' '- Overall result: **No-Go** pending the manual and authorization gates in `operations/go-no-go.md`.'
) -join [Environment]::NewLine ) -join [Environment]::NewLine
@@ -259,7 +260,8 @@ try {
sha256 = $apkSha256 sha256 = $apkSha256
signerSha256 = ([string]$evidence.app.signerSha256).ToLowerInvariant() signerSha256 = ([string]$evidence.app.signerSha256).ToLowerInvariant()
internalTestOnly = $true internalTestOnly = $true
manualPrivacyChoicePending = $true androidDeviceAcceptancePending = $true
loginLegalInteractionOnAndroidPending = $true
} }
backend = [ordered]@{ backend = [ordered]@{
artifact = $backendName artifact = $backendName
@@ -275,7 +277,9 @@ try {
schema = '64/64' schema = '64/64'
runtimeSchemaBootstrap = 'false/default' runtimeSchemaBootstrap = 'false/default'
routeProbe = '20/20: 1 public 200, 6 auth 401, 13 method 405' routeProbe = '20/20: 1 public 200, 6 auth 401, 13 method 405'
smsOrLoginTriggered = $false deployPlanSmsOrLoginTriggered = $false
authenticatedFixedCodeSmokePassed = $true
fixedCodeNoRealSmsConfirmed = $true
} }
contentCandidates = [ordered]@{ contentCandidates = [ordered]@{
artifact = 'aug1-life-advisor-content-candidates-v0.1.json' artifact = 'aug1-life-advisor-content-candidates-v0.1.json'
+9 -3
View File
@@ -5,8 +5,8 @@ $devSetupPath = Join-Path $projectRoot 'docs\DEV_SETUP.md'
$source = Get-Content -Raw -Encoding UTF8 -LiteralPath $scriptPath $source = Get-Content -Raw -Encoding UTF8 -LiteralPath $scriptPath
$requiredFragments = @( $requiredFragments = @(
"output\aug1-rc\0.1.12-112-b9e08789-frozen", "output\aug1-rc\0.1.13-113-af8af2f6-frozen",
'b9e08789265b73524e3ce2646abe2f2fc4565906', 'af8af2f6dd169e4616a4ca0ca724e8b809502ab3',
'Runtime commit must be an ancestor of the operations commit', 'Runtime commit must be an ancestor of the operations commit',
'Frozen evidence is not release eligible', 'Frozen evidence is not release eligible',
'Frozen APK hash mismatch', 'Frozen APK hash mismatch',
@@ -20,7 +20,10 @@ $requiredFragments = @(
'Release package already exists and will not be overwritten', 'Release package already exists and will not be overwritten',
'Release package expected 14 files', 'Release package expected 14 files',
'ZIP entry hash mismatch', 'ZIP entry hash mismatch',
'package_verified=true' 'package_verified=true',
'authenticatedFixedCodeSmokePassed = $true',
'fixedCodeNoRealSmsConfirmed = $true',
'deployPlanSmsOrLoginTriggered = $false'
) )
foreach ($fragment in $requiredFragments) { foreach ($fragment in $requiredFragments) {
if (-not $source.Contains($fragment)) { if (-not $source.Contains($fragment)) {
@@ -34,6 +37,9 @@ if ($source -match 'Compress-Archive') {
if ($source -match '\[switch\]\$Force') { if ($source -match '\[switch\]\$Force') {
throw 'August 1 packager must not expose an overwrite switch.' throw 'August 1 packager must not expose an overwrite switch.'
} }
if ($source.Contains('manualPrivacyChoicePending') -or $source.Contains('authenticated business, content')) {
throw 'August 1 packager still describes completed fixed-code authentication as a pending gate.'
}
$devSetup = Get-Content -Raw -Encoding UTF8 -LiteralPath $devSetupPath $devSetup = Get-Content -Raw -Encoding UTF8 -LiteralPath $devSetupPath
if (-not $devSetup.Contains('.\scripts\package-aug1-release.ps1')) { if (-not $devSetup.Contains('.\scripts\package-aug1-release.ps1')) {