diff --git a/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md b/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md index 710aa8e2..cc9496e0 100644 --- a/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md +++ b/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md @@ -14,7 +14,17 @@ 上述事实只证明本批版本和 schema 已发布。正式 OTP、真机能力、角色权限正反例和严格试点窗口仍需按发布后回归及 `DEMO_ACCEPTANCE.md` 验收。 -2026-07-20 增量已把“项目服务记忆最小切片”扩展为工作助手确认式统一采集:显式“记一下”生成候选,用户确认后按 `PRIVATE/COMPANY` 写入 `aihr_assistant_capture`;个人记录仅本人可见,公司记录先保持 `PENDING`,正式接收端和回执尚未实现。旧 `aihr_service_memory/version` 继续兼容项目记录;本批仍不包含项目名称选择、今日工作成果、原始来源绑定、个人文件/网页知识空间、自动派单或向量化个人资料。同批“工作上报语音会话化”继续使用既有 `aihr_work_report`,并补 `request_key/request_hash` 和唯一索引。2026-07-21 只读复核确认生产 JAR、H5 资源、两张确认式采集表和工作上报幂等字段存在;完整迁移计数仍应在下一次发布前由 `release-preflight.sh` 重跑,不沿用历史 `41/41` 数字。 +2026-07-20 增量把“项目服务记忆最小切片”扩展为工作助手确认式统一采集:显式“记一下”生成候选,用户确认后按 `PRIVATE/COMPANY` 写入 `aihr_assistant_capture`;个人记录仅本人可见,公司记录先保持 `PENDING`,正式接收端和回执尚未实现。旧 `aihr_service_memory/version` 继续兼容项目记录;同批会话式“工作上报”继续使用既有 `aihr_work_report`,并补 `request_key/request_hash` 和唯一索引。 + +2026-07-21 已在生产发布项目化工作助手与今日工作成果提交 `4536d607`,并发布确认卡首屏修正 `11250811`: + +- 执行 `aihr_20260721_org_multi_project_membership_mysql8.sql` 与 `aihr_20260721_work_assistant_results_mysql8.sql`,目标新表、字段和组织多项目唯一约束核验通过; +- 后端 JAR、H5 入口资源与本地发布产物哈希一致,`wygj-aihr.service` 为 `active`; +- 正式员工账号完成项目读取、伪造项目拒绝、文字巡检确认卡、候选撤销和按员工 + 项目 + 日期幂等生成成果回归; +- 当前正式员工账号只返回一个授权项目“银河湾星苑”,故生产仅证明单项目自动选择,多项目名称下拉继续以本地双项目授权数据为证; +- 本次完整备份位于 `/opt/wygj/backups/work-assistant-20260721-044923`,包含数据库、旧 JAR、完整 H5 和 SHA-256 清单。 + +上述事实仍不代表生产真机语音/照片/视频、主管正式账号、正式组织多项目 dry-run 或外部线索/工单/考勤回执已验收。个人文件、网页收藏、独立个人向量库、自动派单和未经确认的自动外发仍不在本轮范围。 ## 发布前置条件 @@ -84,7 +94,8 @@ WHERE table_schema = DATABASE() 'aihr_candidate_material', 'aihr_interview_result', 'aihr_candidate_employee_link', 'aihr_position_responsibility', 'aihr_sop_applicability', 'aihr_onboard_task', 'aihr_qualification_gate', - 'aihr_memory_candidate', 'aihr_assistant_capture', 'aihr_service_memory', 'aihr_service_memory_version', + 'aihr_memory_candidate', 'aihr_assistant_capture', 'aihr_assistant_capture_status_log', + 'aihr_daily_work_result', 'aihr_service_memory', 'aihr_service_memory_version', 'aihr_work_report' ) ORDER BY table_name; @@ -108,6 +119,10 @@ WHERE table_schema = DATABASE() OR (table_name = 'aihr_onboard_task' AND column_name IN ('ext_party_id', 'position_code', 'task_type', 'status', 'assign_by')) OR (table_name = 'aihr_qualification_gate' AND column_name IN ('ext_party_id', 'position_code', 'cert_id', 'passed', 'valid_thru')) OR (table_name = 'aihr_work_report' AND column_name IN ('request_key', 'request_hash')) + OR (table_name = 'aihr_memory_candidate' AND column_name IN ('work_date', 'source_snapshot_json')) + OR (table_name = 'aihr_assistant_capture' AND column_name IN ('work_date', 'source_snapshot_json', 'business_status')) + OR (table_name = 'aihr_knowledge_conversation' AND column_name = 'project_code') + OR (table_name = 'aihr_daily_work_result' AND column_name = 'content_hash') OR (table_name = 'aihr_web_search_provider' AND column_name IN ('agent_id', 'agent_version')) ) ORDER BY table_name, column_name; @@ -130,16 +145,17 @@ GROUP BY question_type ORDER BY question_type; ``` -预期是三张场景/Rubric 表、岗位题库、训练反馈表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表,以及四张记忆表和原工作上报表均存在;工作上报幂等字段为 `2/2`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。 +预期是三张场景/Rubric 表、岗位题库、训练反馈表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表、四张记忆表、采集状态历史表、每日成果表和原工作上报表均存在;工作上报幂等字段为 `2/2`,工作助手新增字段为 `7/7`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。 ## 迁移后应用回归 1. 重启 `wygj-aihr.service`,确认状态为 `active`。 2. 检查根站、`/h5/`、租户接口和员工首页 API 的 HTTP 与业务码均为 `200`。 3. 用正式测试账号完成员工端训练、主管复盘和管理端场景/Prompt 只读检查;不要使用开发固定验证码验证生产安全策略。 -4. 用正式测试账号在“工作助手”说“帮我记一下三栋 3203 需要保洁服务”;确认前 `aihr_assistant_capture` 不得新增。分别验证 `PRIVATE` 仅本人可召回、`COMPANY` 只显示 `PENDING` 且没有虚假送达回执;新开对话按房号查询必须只命中对应记录,双击确认不得重复写入。测试结束保留审计证据,不直接删除生产业务记录。 -5. 用员工测试账号进入“工作上报”,确认首屏为语音会话而非传统表单;完成一次整理、建议类型修改和显式确认。确认前 `aihr_work_report` 行数不变,重复提交同一 `request_key` 只有一条 `PENDING` 记录,“我的上报”返回同一 ID;普通员工审核仍为 `403`,审核通过不自动写入案例、知识或积分表。 -6. 迁移完成后再按同一正式时间窗运行: +4. 用正式测试账号在“工作助手”选择当前项目并说“帮我记一下三栋 3203 需要保洁服务”;确认前 `aihr_assistant_capture` 不得新增。分别验证 `PRIVATE` 仅本人可召回、`COMPANY` 只显示 `PENDING` 且没有虚假送达回执;新开对话按房号查询必须只命中对应项目记录,双击确认不得重复写入。测试表达如不需长期保留,应在确认卡选择“暂不保存”,不要直接删除生产审计记录。 +5. 在“今日工作成果”按员工 + 项目 + 日期重复生成两次,内容不变时版本哈希必须一致;员工访问团队结果、主管访问非授权项目必须被拒绝。生产无主管正式测试账号时必须明确记录未验收,不以本地 seed 代替。 +6. 用员工测试账号进入“成果投稿”,确认其仍只承载优秀案例、操作视频、完整 SOP 和有用知识,不回退为日常事实表单。重复提交同一 `request_key` 只有一条 `PENDING` 记录;普通员工审核仍为 `403`,审核通过不自动写入案例、知识或积分表。 +7. 迁移完成后再按同一正式时间窗运行: ```bash AIHR_PILOT_TENANT_ID=000000 \ diff --git a/docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx b/docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx index e3476177..906e1580 100644 Binary files a/docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx and b/docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx differ diff --git a/docs/visual-evidence/20260721/production-employee-daily-work-result-empty-390x844.png b/docs/visual-evidence/20260721/production-employee-daily-work-result-empty-390x844.png new file mode 100644 index 00000000..4e3c3564 Binary files /dev/null and b/docs/visual-evidence/20260721/production-employee-daily-work-result-empty-390x844.png differ diff --git a/docs/visual-evidence/20260721/production-work-assistant-confirmation-card-390x844.png b/docs/visual-evidence/20260721/production-work-assistant-confirmation-card-390x844.png new file mode 100644 index 00000000..87590edc Binary files /dev/null and b/docs/visual-evidence/20260721/production-work-assistant-confirmation-card-390x844.png differ diff --git a/docs/visual-evidence/20260721/production-work-assistant-project-selector-390x844.png b/docs/visual-evidence/20260721/production-work-assistant-project-selector-390x844.png new file mode 100644 index 00000000..4d6e4a3c Binary files /dev/null and b/docs/visual-evidence/20260721/production-work-assistant-project-selector-390x844.png differ diff --git a/docs/工作助手与今日工作成果迭代计划-20260721.md b/docs/工作助手与今日工作成果迭代计划-20260721.md index 2248b190..d6b30f2c 100644 --- a/docs/工作助手与今日工作成果迭代计划-20260721.md +++ b/docs/工作助手与今日工作成果迭代计划-20260721.md @@ -1,10 +1,10 @@ # 工作助手与今日工作成果迭代计划 -> 版本:v1.4 +> 版本:v1.5 > 日期:2026-07-21 -> 状态:迭代 0-4 已完成本地实现、目标测试、真实 HTTP 与 390×844 视觉交互验证;尚未提交、部署和生产验证 +> 状态:迭代 0-4 已实现、提交并部署;目标测试、真实 HTTP、390×844 视觉交互及生产真实员工账号主链路已验证,真机媒体和外部正式接口仍待验收 > 适用范围:员工端工作助手、今日工作成果、主管项目视图、成果投稿及后续外部流转 -> v1.4:在 v1.3 基础上把 UI 变化、权威高保真图、仓库内运行截图和正式汇报 PPT 的准确路径统一落盘;设计目标、本地运行截图与生产状态继续严格区分。 +> v1.5:在 v1.4 基础上补记生产发布、真实账号回归和生产截图;确认卡改为优先展示 AI 识别结论,再由用户向下查看并执行保存动作。 ## 0. 文档权威关系与冲突裁决 @@ -28,7 +28,7 @@ 4. **附件是否已经被 AI 看懂**:工作助手的现场图片/视频已有本次分析能力;确认式采集已能把受保护 OSS 来源绑定到记录并重新鉴权回看。成果投稿链仍不能仅凭附件名称声称已经理解图片或视频内容。 5. **“个人助理已实现”是什么意思**:确认式采集已经提交并部署,但个人文件、网页收藏、独立个人向量库、分享和 PPT 生成仍未实现;两者不能合并宣称完成。 6. **今日成果与外部流转**:员工今日成果和主管项目成果已完成本地最小闭环;真实线索/工单投递仍未接通,`COMPANY/PENDING` 只表示待流转。 -7. **部署与验收**:2026-07-20 生产 JAR、H5 资源及目标表结构已确认包含确认式采集和会话式工作上报;这属于部署与生产基础验证,不等于多项目、真机、正式账号和业务窗口验收通过。 +7. **部署与验收**:2026-07-21 已完成本轮数据库幂等迁移、后端 JAR 与 H5 发布,并用正式员工账号验证项目读取、越权拒绝、确认卡、撤销和按项目/日期幂等生成成果;生产账号当前只有一个授权项目,因此多项目切换仍以本地双项目证据为准,真机媒体和正式业务窗口仍未验收。 ## 1. 目标与边界 @@ -50,7 +50,7 @@ | 今日工作成果 | 今天做了什么,还有什么没完成 | 自动汇总、个人查看、主管查看 | | 成果投稿 | 这条经验值得让公司复用 | 优秀案例、SOP、视频、知识投稿 | -当前代码和页面仍使用「工作上报」名称,其四类审核内容在产品语义上对应“成果投稿”。既有审核链继续保留,日常工作事实则统一进入工作助手。 +当前员工端已经将原「工作上报」更名为「成果投稿」,四类审核内容和既有审核链继续保留;日常工作事实统一进入工作助手,不再让用户误以为必须先填传统上报表单。 ### 1.2 业务链路 @@ -103,7 +103,7 @@ UI 与代码页面的对应关系: |---|---|---| | 多项目名称选择面板 | `docs/visual-evidence/20260721/work-assistant-project-picker-fixed-390x844.png` | 两个项目完整可见;面板使用 `--window-bottom` 避开底栏 | | 已选择当前项目的工作助手 | `docs/visual-evidence/20260721/work-assistant-selected-project-390x844.png` | 顶部显示项目名称,切换提示明确,不显示项目编码 | -| 巡检确认卡自动定位到操作区 | `docs/visual-evidence/20260721/work-assistant-inspection-card-autoscroll-390x844.png` | 项目、日期、来源、业务状态与四个确认动作可操作 | +| 巡检确认卡阶段性定位证据 | `docs/visual-evidence/20260721/work-assistant-inspection-card-autoscroll-390x844.png` | 当次本地验证证明四个动作可操作;生产回归发现卡片开头会被顶出屏幕,已由 §1.6 的“识别结论优先”实现取代 | | 员工今日工作成果 | `docs/visual-evidence/20260721/employee-daily-work-result-fixed-390x844.png` | 按项目和日期聚合;已记录事项不再错误显示处理动作 | | 主管项目成果 | `docs/visual-evidence/20260721/supervisor-project-work-results-fixed-390x844.png` | 显示记录人数、成果人数、待跟进、高优问题和员工来源类型;非文字记录可打开受保护原始来源 | @@ -116,6 +116,18 @@ UI 与代码页面的对应关系: 3. `output/imagegen/work-assistant-project-context-v3.png` 仅保留生成过程来源,不纳入 Git,也不能写入开发任务或验收报告作为权威资产。 4. 新增项目选择面板、今日成果详情页或主管项目视图高保真图时,继续放入 `docs/prototypes/`,并回填本表和对应迭代章节。 +### 1.6 生产运行视觉证据(390×844) + +下列截图来自 `https://peilian.njzhmj.top/h5/`,使用已授权的正式员工账号和脱敏测试表达完成;测试产生的候选记录在验证后选择“暂不保存”,没有写入长期工作记录: + +| 生产页面或状态 | 仓库内截图路径 | 验证结论 | +|---|---|---| +| 单项目员工的工作助手 | `docs/visual-evidence/20260721/production-work-assistant-project-selector-390x844.png` | 顶部只显示项目名称“银河湾星苑”,不显示内部项目编码;单项目自动选择 | +| 巡检确认卡识别结论优先 | `docs/visual-evidence/20260721/production-work-assistant-confirmation-card-390x844.png` | 卡片首先展示建议类型、项目、对象、事项、摘要、日期和来源;用户再向下查看确认动作 | +| 员工今日工作成果空状态 | `docs/visual-evidence/20260721/production-employee-daily-work-result-empty-390x844.png` | 项目、日期、记录数、待跟进和成果版本清晰;没有已确认记录时不伪造内容 | + +生产证据绝对目录:`/Users/yuanjiantsui/dev/11-project/wygj/docs/visual-evidence/20260721/`。生产账号只有一个项目,故项目下拉的多选形态仍以 §1.5 的本地双项目截图和权威高保真图为准。 + 相对当前页面的变化: 1. 页面标题继续使用「问 · 数字师傅」,顶部增加按项目名称操作的「当前项目」选择器,不展示项目编码。 @@ -124,12 +136,13 @@ UI 与代码页面的对应关系: 4. 确认卡增加项目、日期、地点、事项、原始语音/现场照片来源和本地业务状态;确认后才计入今日工作成果。 5. 「确认记录」与「提交公司处理」分开;后者只显示「进入待流转」,不得显示已派单或已送达。 6. 底部继续以「按住说话」为主入口,键盘、快捷指令和「今日 / 练 / 问 / 我」导航保持原有交互习惯。 +7. 含确认卡的 AI 回复不再一律滚到消息底部,而是定位到该条回复开头,让用户先核对识别结论;普通短消息仍保持滚到底部。 | 图中元素 | 对应迭代 | 当前状态 | |---|---|---| -| 当前项目名称选择器、切换提示 | 迭代 1 | 已本地实现并完成 390×844 视觉交互验证 | -| 项目化确认卡、来源入口、业务状态 | 迭代 2 | 已本地实现;文字链路已完成真实 HTTP 与页面验证,媒体来源仍需生产真机回归 | -| 今日工作成果摘要入口 | 迭代 3 | 已本地实现,员工详情页和主管项目视图已完成视觉验证 | +| 当前项目名称选择器、切换提示 | 迭代 1 | 已实现并部署;生产单项目自动选择通过,本地双项目名称选择通过 | +| 项目化确认卡、来源入口、业务状态 | 迭代 2 | 已实现并部署;文字链路完成生产真实账号 HTTP 与 390×844 页面验证,媒体来源仍需真机回归 | +| 今日工作成果摘要入口 | 迭代 3 | 已实现并部署;员工生产空状态、员工本地有数据状态和主管本地项目视图均已视觉验证 | | 提交公司处理、进入待流转 | 当前确认式采集 + 迭代 5 | `PENDING` 已有;真实外部投递和回执未实现 | 该图只定义信息层级、交互语义和视觉方向,不是生产截图。项目选择面板、员工今日成果详情页和主管项目视图已按 390×844 运行页面完成视觉验收,证据见 §1.5;生产发布后仍需重新完成真机验收。 @@ -150,7 +163,7 @@ UI 与代码页面的对应关系: - `/api/aihr/mobile/me` 已返回完整授权项目列表;生产组织同步仍需用真实多项目人员验证。 - 数据层和前端已支持按项目名称选择、切换与账号隔离缓存。 - 图片和视频可用于本次分析,确认记录已支持绑定受保护原始附件;生产真机媒体链路尚待回归。 -- 查询审计只保存问题哈希和来源类型,不能回看原始文字、语音、照片或视频。 +- 已确认记录保存最小必要来源快照,非文字来源通过受保护接口重新鉴权回看;查询审计本身仍只保存问题哈希和来源类型,避免把审计日志误当业务记录。 - 短会话已绑定当前项目,项目不一致拒绝复用。 - 已能按“员工 + 项目 + 自然日”幂等生成工作成果。 @@ -159,7 +172,6 @@ UI 与代码页面的对应关系: - 真实外部线索、工单、考勤投递与回执。 - 生产真机语音、照片、视频来源回看验收。 - 未经确认的自动外发(本期明确不做)。 -- 原始文字、语音、照片、视频追溯。 - 公司处理类事项的真实外部回执。 ### 2.4 外部边界 @@ -272,7 +284,7 @@ UI 与代码页面的对应关系: ### 确认卡 -本迭代 UI 设计输入:`docs/prototypes/work-assistant-project-context-v3.png`,详见 [§1.3](#13-ui-变化与高保真基准) 和 [§1.4](#14-ui-设计交付清单)。确认卡的项目、日期、来源和业务状态已实现;文字巡检场景运行截图见 §1.5,媒体来源仍需生产真机回归。 +本迭代 UI 设计输入:`docs/prototypes/work-assistant-project-context-v3.png`,详见 [§1.3](#13-ui-变化与高保真基准) 和 [§1.4](#14-ui-设计交付清单)。确认卡的项目、日期、来源和业务状态已实现;文字巡检的最终生产截图见 §1.6,媒体来源仍需生产真机回归。 确认卡至少展示: @@ -470,7 +482,7 @@ UI 与代码页面的对应关系: ## 5. 汇报 PPT 计划与交付 -正式汇报稿已按 16:9、白底、银城红和深灰视觉体系完成,共 5 页;员工和主管页面均使用 2026-07-21 本地 390×844 脱敏运行截图,不用概念图冒充线上效果。 +正式汇报稿已按 16:9、白底、银城红和深灰视觉体系完成,共 5 页;员工和主管页面使用 2026-07-21 脱敏运行截图,高保真图仅作为设计基准,不冒充生产截图。第 5 页已按本次生产发布结果更新。 权威 PPTX 路径:`docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx`。 @@ -500,14 +512,13 @@ UI 与代码页面的对应关系: ### 第 5 页:交付状态与下一步 -- 严格区分已实现、已本地验证、已视觉验证、待部署和待外部接口。 -- 给出备份、迁移、后端/H5 发布、真实账号回归和权限回归顺序。 +- 严格区分已实现、已本地验证、已视觉验证、已部署、生产已验证和待外部接口。 +- 记录备份、迁移、后端/H5 发布、真实账号回归和权限回归结果。 ### 交付物 - PPTX:`docs/presentations/数字师傅工作助手迭代汇报-20260721.pptx`。 -- PDF。 -- 演讲备注。 +- PDF 与演讲备注:按正式会议版本另行导出,不把尚未生成的文件列为已交付。 - 脱敏截图素材:`docs/visual-evidence/20260721/`。 - 无网络环境可播放的录屏备份。 @@ -525,7 +536,7 @@ UI 与代码页面的对应关系: | PPT 与演示材料 | 1-1.5 | 是 | | 迭代 5:外部接口 | 3-5 | 否,等待正式契约 | -内部 MVP(迭代 0-4 加 PPT)合计约 10-15 人日。每个迭代单独提交、部署和生产验证,不进行一次性大爆炸发布。 +内部 MVP(迭代 0-4 加 PPT)原估算约 10-15 人日;本轮依托既有确认式采集和问师傅链路完成最小闭环,并已作为同一兼容发布批次上线。后续外部流转继续独立发布。 推荐发布批次: @@ -559,6 +570,19 @@ UI 与代码页面的对应关系: - 生产验证通过。 - 仍受外部接口或业务规则阻塞的边界。 +### 8.1 2026-07-21 生产发布记录 + +- 功能提交:`4536d607 feat: add project-scoped work assistant results`。 +- 确认卡首屏修正:`11250811 fix: show work capture context before actions`。 +- 生产备份:`/opt/wygj/backups/work-assistant-20260721-044923`,包含数据库、旧 JAR、完整 H5 与哈希清单。 +- 生产数据库:组织多项目唯一约束与工作成果/状态表迁移执行成功;目标表及字段检查通过。 +- 生产后端:`wygj-aihr.service` 为 `active`,线上 JAR SHA-256 与本地构建一致。 +- 生产 H5:入口资源为 `assets/index-CXWK6x5P.js`,本地、服务器和公网 SHA-256 均为 `2bcd96dc97af6f0e7e6d69f022b6eeaad5a855d6246044ef9ec3c05a6657388d`。 +- 生产 HTTP:根入口、H5、租户接口、移动首页、登录、`/api/aihr/mobile/me`、知识查询、候选撤销和今日成果生成均成功。 +- 权限与幂等:伪造项目被业务层以 `403` 拒绝;同一员工、项目和日期重复生成成果得到相同版本哈希。 +- 正式员工账号现状:返回一个授权项目“银河湾星苑”,因此单项目自动选择已验证;双项目下拉仍以本地授权数据验证,不宣称生产多项目验收完成。 +- 未完成边界:生产真机语音、照片、视频采集与来源回看;主管正式账号生产回归;外部线索、画像、工单、考勤接口与真实回执。 + 最小验证链: 1. 后端目标单元测试和数据库迁移验证。 @@ -569,18 +593,18 @@ UI 与代码页面的对应关系: 6. 代码审查并处理确认问题。 7. 发布前备份,发布后使用真实试点账号完成生产回归。 -### 8.1 2026-07-21 本地验证快照 +### 8.2 2026-07-21 本地验证快照 - 后端目标测试通过:确认式采集、项目化会话、移动身份、多项目组织同步、今日成果和主管项目权限。 -- 移动端新增目标测试 6/6 通过,`vue-tsc --noEmit` 通过,H5 正式构建通过。 +- 移动端新增目标测试 7/7 通过,`vue-tsc --noEmit` 通过,H5 正式构建通过。 - 真实本地 HTTP 已验证:手机号登录、两项目列表、越权项目 403、巡检识别、PRIVATE/COMPANY 确认、状态幂等重试、冲突键 409、状态历史、两项目日报隔离、内容不变版本不增长、普通员工团队视图 403、主管跨项目 403。 - 390×844 实际交互已验证:项目面板、项目切换、文字采集、确认卡、确认保存、今日成果、状态推进、主管项目成果;截图路径见 §1.5。 - 旧移动端组合合同测试仍有 15 条失败:其中多数是旧首页/旧“工作上报”文案合同与本轮产品定案冲突,另有 uni-app 测试打包器与当前 Vue 版本的既有兼容错误;不得据此声称全量移动端测试通过,提交前需把过期合同迁移或明确列为基线债务。 -- 尚未完成:生产迁移、正式发布、生产真机媒体回看、真实组织多项目 dry-run、外部线索/工单/考勤投递与回执。 +- 本地仍未覆盖且已在生产记录中保留边界:生产真机媒体回看、真实组织多项目 dry-run、主管正式账号回归、外部线索/工单/考勤投递与回执。 ## 9. 推荐施工顺序 -内部 MVP 在 R1-R3 中按以下顺序完成: +内部 MVP 已按以下顺序在 R1-R3 范围内完成并于 2026-07-21 合并发布: 1. 项目名称下拉选择。 2. 项目切换后的会话隔离。 @@ -589,4 +613,4 @@ UI 与代码页面的对应关系: 5. 原始来源追溯。 6. 今日工作成果。 -完成以上六项后,项目将形成可供客户真实体验的一线工作闭环。主管项目汇总、成果投稿联动和外部接口进入后续发布批次。 +以上六项已经形成可供客户真实体验的一线工作闭环;主管项目汇总已完成本地实现和权限验证,成果投稿分流已上线。后续只把正式外部接口、主管正式账号生产回归和真机媒体验收作为独立批次处理。 diff --git a/scripts/release-preflight.sh b/scripts/release-preflight.sh index 885a85f1..e8de7f34 100755 --- a/scripts/release-preflight.sh +++ b/scripts/release-preflight.sh @@ -156,6 +156,8 @@ FROM ( UNION ALL SELECT 'aihr_qualification_gate' UNION ALL SELECT 'aihr_memory_candidate' UNION ALL SELECT 'aihr_assistant_capture' + UNION ALL SELECT 'aihr_assistant_capture_status_log' + UNION ALL SELECT 'aihr_daily_work_result' UNION ALL SELECT 'aihr_service_memory' UNION ALL SELECT 'aihr_service_memory_version' UNION ALL SELECT 'aihr_work_report' @@ -211,8 +213,36 @@ REMOTE [[ "$work_report_unique_index" = "0|tenant_id,submitter_user_id,request_key|0" ]] \ || fail "remote work-report unique index invalid: expected unique full columns tenant_id,submitter_user_id,request_key; got ${work_report_unique_index:-missing}" - echo "remote_schema=41/41 $remote_ssh:$remote_db" + local missing_work_assistant_columns + missing_work_assistant_columns="$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$remote_ssh" bash -s -- "$remote_db" <<'REMOTE' +set -euo pipefail +db="$1" +mysql --batch --skip-column-names --connect-timeout=5 "$db" <<'SQL' +SELECT CONCAT(required.table_name, '.', required.column_name) +FROM ( + SELECT 'aihr_memory_candidate' AS table_name, 'work_date' AS column_name + UNION ALL SELECT 'aihr_memory_candidate', 'source_snapshot_json' + UNION ALL SELECT 'aihr_assistant_capture', 'work_date' + UNION ALL SELECT 'aihr_assistant_capture', 'source_snapshot_json' + UNION ALL SELECT 'aihr_assistant_capture', 'business_status' + UNION ALL SELECT 'aihr_knowledge_conversation', 'project_code' + UNION ALL SELECT 'aihr_daily_work_result', 'content_hash' +) required +LEFT JOIN information_schema.columns actual + ON actual.table_schema = DATABASE() + AND actual.table_name = required.table_name + AND actual.column_name = required.column_name +WHERE actual.column_name IS NULL +ORDER BY required.table_name, required.column_name; +SQL +REMOTE + )" || fail "remote work-assistant schema check failed: $remote_ssh:$remote_db" + + [[ -z "$missing_work_assistant_columns" ]] \ + || fail "remote work-assistant schema missing required columns: $(printf '%s' "$missing_work_assistant_columns" | tr '\n' ', ' | sed 's/, $//')" + echo "remote_schema=43/43 $remote_ssh:$remote_db" echo "remote_work_report_idempotency=3/3 $remote_ssh:$remote_db" + echo "remote_work_assistant_columns=7/7 $remote_ssh:$remote_db" } changed_files="$(git status --porcelain)"