补充安全权限日志与草稿状态约定
This commit is contained in:
@@ -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` 通过。
|
||||
|
||||
## 执行备注
|
||||
|
||||
|
||||
Reference in New Issue
Block a user