补充安全权限日志与草稿状态约定

This commit is contained in:
talesofzes
2026-06-22 17:30:59 +08:00
parent df0b3fa267
commit a41e2c28d4
19 changed files with 451 additions and 129 deletions
@@ -22,8 +22,9 @@
8. `docs/contracts/API接口约定.md`
9. `docs/contracts/数据对象约定.md`
10. `docs/contracts/状态流转约定.md`
11. `docs/checklists/AI生成代码检查清单.md`
12. `docs/checklists/后端Review清单.md`
11. `docs/contracts/安全权限日志约定.md`
12. `docs/checklists/AI生成代码检查清单.md`
13. `docs/checklists/后端Review清单.md`
## 范围边界
@@ -47,6 +48,7 @@
2. 真实联调前必须确认飞书正式应用、HTTPS 回调地址、个人消息权限、交互卡片权限、老板 / 程经理 / 第一批试用人员映射,以及百炼 API Key 环境变量。
3. Docker / 部署环境固定 Python 3.12.13;本地开发允许 Python 3.11 或 3.12,但提交前必须在 Python 3.12.13 环境跑完整测试。
4. scheduler 必须作为独立进程运行,同一环境同一应用库同时只能启动一个 scheduler 进程。
5. tests 是真实约束;每个任务完成前必须说明新增或修改了哪些测试、覆盖哪些 spec / contract 约定和如何运行。
## 文件结构
@@ -202,7 +204,7 @@ Expected: `System check identified no issues`。
- [ ] **Step 2: 实现 PersonMapping**
字段必须覆盖 `person_mappings`,并支持别名 JSON。
字段必须覆盖 `person_mappings`,并支持别名 JSON`user_id``manager_user_id``users` 负责登录和权限,`person_mappings` 负责称呼、飞书身份和第一批试用人员映射
- [ ] **Step 3: 实现 PromptContext**
@@ -255,16 +257,16 @@ Expected: migrations 成功,权限、审计和 AI 记忆测试通过。
- [ ] **Step 1: 实现 AiDraft 模型和 AiSecretaryResponse 结构**
字段必须覆盖 `ai_drafts`,状态必须来自 `状态流转约定.md``qa/realtime_qa/note/need_more_info/unsupported/context_summary``ai_drafts`,只写 `secretary_messages``model_call_logs`必要 `operation_logs`
字段必须覆盖 `ai_drafts`,状态必须来自 `状态流转约定.md``qa/realtime_qa/note/need_more_info/unknown/unsupported/context_summary`进入事项、提醒或通知闭环,只写 `secretary_messages``model_call_logs`必要 `operation_logs`,或按 contract 写最小留痕草稿
- [ ] **Step 2: 实现 AI 输出 validator**
validator 必须校验:
1. JSON 可解析。
2. `intent` 只能是 `task/reminder/qa/realtime_qa/note/need_more_info/unsupported`
2. `intent` 只能是 `task/reminder/qa/realtime_qa/note/need_more_info/unknown/unsupported`
3. `task` / `reminder` 才允许 `should_create_draft = true``draft_type` 必须对应为 `task``reminder`
4. `qa/realtime_qa/note/need_more_info/unsupported` 必须 `should_create_draft=false``draft_type=none`
4. `qa/realtime_qa/note/need_more_info/unknown/unsupported` 必须 `should_create_draft=false``draft_type=none`
5. `need_more_info``questions` 至少 1 个、最多 3 个;其他 intent 时 `questions` 为空数组。
6. `task``route_type` 只能是 `direct_after_boss_confirm``manager_confirm_required`,其他 intent 为 `none`
7. `answer` 不得出现“已通知、已创建、已发送”等执行语义。
@@ -283,7 +285,7 @@ service 流程:
-> 按 source + message_id 做幂等检查
-> 校验老板角色
-> 读取 BotContext
-> 判断 follow_up / new_request / qa / realtime_qa / note / unsupported / command
-> 判断 follow_up / new_request / qa / realtime_qa / note / unknown / unsupported / command
-> 组装 PromptContext
-> 调用 ai_client
-> 写 model_call_logs
@@ -336,7 +338,7 @@ Expected: AI 输出校验、解析失败、实时问答、补充/重说测试全
- [ ] **Step 1: 实现模型**
字段必须覆盖 `tasks``reminders``notifications``feedbacks`
字段必须覆盖 `tasks``reminders``notifications``feedbacks``notifications` 必须包含 `target_type=ai_draft``purpose``trigger_time``idempotency_key``action_token_hash``expires_at``invalidated_at` 等字段。
- [ ] **Step 2: 实现事项 service**
@@ -409,7 +411,7 @@ Expected: 权限、状态、反馈原因和通知失败测试通过。
- [ ] **Step 3: 实现事件幂等**
同一 `event_id` 重放时只返回已有处理结果,不重复创建草稿、事项、提醒或反馈。
同一 `event_id` 重放时只返回已有处理结果,不重复创建草稿、事项、提醒或反馈。没有稳定 `event_id` 的卡片回调必须使用 `idempotency_key`
- [ ] **Step 4: 实现老板机器人入口**
@@ -431,6 +433,7 @@ Expected: 权限、状态、反馈原因和通知失败测试通过。
3. 老板取消草稿。
4. 接收人反馈事项或提醒。
5. 程经理待确认提醒只跳转平台。
6. 旧卡片、失效卡片、已替代草稿和已过期通知只记录 `feishu_events`,不写业务对象。
- [ ] **Step 6: 跑测试**
@@ -458,11 +461,11 @@ Expected: 验签、幂等、非老板访问、卡片反馈测试通过。
- [ ] **Step 1: 实现草稿确认和转换**
`CONFIRMED -> CONVERTED` 只允许执行一次。`task` 草稿转换为事项,`reminder` 草稿转换为提醒。转换失败时不回滚老板确认,写 `FailureRecord(draft_convert_failed)`
`confirmed -> converted` 只允许执行一次。`task` 草稿转换为事项,`reminder` 草稿转换为提醒。转换失败时不回滚老板确认,写 `FailureRecord(draft_convert_failed)`
- [ ] **Step 2: 实现复杂事项转程经理确认**
`route_type = manager_confirm_required` 时,草稿进入 `NEED_MANAGER_CONFIRM`,创建程经理待确认记录,并生成给程经理的飞书提醒;程经理确认后才进入 `CONFIRMED` 并转换任务
`route_type = manager_confirm_required` 时,老板确认后草稿进入 `confirmed`,转换时先创建 `tasks.status=pending_manager_confirm` 的事项壳,并生成给程经理的飞书提醒;事项壳创建成功后草稿进入 `converted`。程经理确认事项壳后补齐接收人和内容,再进入通知流程
- [ ] **Step 3: 实现 scheduler command**
@@ -590,7 +593,9 @@ Expected: 全部测试通过,Django check 无错误。
7. 定时提醒重复触发防护有测试。
8. 通知失败、AI 解析失败、回调失败有失败记录。
9. 普通日志不包含密钥、token、完整手机号或完整邮箱。
10. `python manage.py test``python manage.py check` 通过
10. OAuth code/state、回调验签密钥、一次性操作 token 明文不进入普通日志或业务表
11. 每个任务完成前说明新增或修改了哪些 tests、覆盖哪些 spec / contract 约定和如何运行。
12. `python manage.py test``python manage.py check` 通过。
## 执行备注