第 7 周作业报告
提交信息
姓名:未提供
SUNet ID:未提供
引用资料:FastAPI 请求验证与异常处理文档、Pydantic v2 模型文档、SQLAlchemy ORM 关系文档。
完成用时:未单独记录。
本目录未关联远程 PR,也没有可引用的提交哈希。下面如实标为
N/A(本地工作区),不虚构链接或审查记录。Graphite Diamond 服务未在当前环境中运行;“审查结果”记录的是按 Diamond 检查维度完成的本地复核,不冒充服务输出。
任务 1:添加更多端点和验证
a. 相关提交或议题
N/A(本地工作区,未创建远程 PR/issue,提交哈希不可用)
b. PR 描述
为笔记和行动项补齐创建、列表、单条读取、局部更新和删除接口;保留行动项“一键完成”接口。列表参数限制为 skip >= 0、1 <= limit <= 200,排序字段使用白名单。请求模型会去除字符串首尾空格、拒绝未知字段,并限制标题、正文、描述和标签的长度;布尔字段使用严格类型,不能用 1 代替 true。空 PATCH 会返回 422。统一异常响应为 error.status/message/details:格式错误的 JSON 返回 400,资源不存在返回 404,字段或查询参数不合法返回 422。前端增加标签输入、删除按钮和可见错误提示。
c. Graphite Diamond 审查结果
本地 Diamond 风格复核结论:未发现阻塞问题。
- 正确性:CRUD 路径完整,删除后再次读取会走 404;204 响应不带 JSON。
- API 设计:PATCH 只改显式提供的字段;非法排序字段不再静默回退。
- 安全性:响应内容通过 DOM
textContent展示;请求额外字段被拒绝。 - 建议:生产环境应使用 Alembic 管理已有数据库的模式迁移,而不是只依赖
create_all。这是部署建议,不影响全新数据库运行。
任务 2:扩展提取逻辑
a. 相关提交或议题
N/A(本地工作区,未创建远程 PR/issue,提交哈希不可用)
b. PR 描述
新增结构化提取接口 extract_action_item_details,结果包含描述、勾选状态、截止日期、优先级、负责人和标签。规则支持 [ ]/[x]、TODO:/ACTION:、句末感叹号和常见祈使动词;识别 @high、@low、首个 @name 与去重后的 #tag。日期支持 ISO、MM/DD/YYYY、today/tonight/tomorrow/next week,以及 by/before/on Friday 等星期表达。非法日期不会导致提取崩溃。原有 extract_action_items 继续返回描述字符串,避免破坏原调用方。
c. Graphite Diamond 审查结果
本地 Diamond 风格复核结论:未发现阻塞问题。
- 正确性:
@high/@low不会被误当负责人;复合标签保持输入顺序并去重。 - 可测试性:函数接受可选
today,相对日期测试不依赖运行当天。 - 边界:无行动信号的普通句子被忽略,已勾选任务保留
completed=True。 - 建议:当前是轻量英文启发式,不等同于完整自然语言日期解析器;若扩展多语言,应引入明确词典和时区策略。
任务 3:添加新模型和关系
a. 相关提交或议题
N/A(本地工作区,未创建远程 PR/issue,提交哈希不可用)
b. PR 描述
新增 Tag 模型和 note_tags 联结表,建立 Note 与 Tag 的多对多关系;外键删除规则避免遗留联结记录。笔记创建和更新可直接提交标签名,不存在的标签自动创建,匹配时忽略大小写。新增标签的列表、创建、单条读取和删除接口;重复标签返回 400。笔记响应内嵌标签,并支持同时按全文关键词和标签筛选。
c. Graphite Diamond 审查结果
本地 Diamond 风格复核结论:未发现阻塞问题。
- 数据完整性:标签名有唯一索引,联结表使用复合主键,避免重复关系。
- ORM 使用:双方通过
back_populates保持一致,并用selectin避免列表序列化时逐条延迟查询。 - API 行为:标签大小写匹配一致;替换笔记标签不会删除仍可复用的标签实体。
- 建议:SQLite 对大小写唯一性的规则与其他数据库可能不同,因此应用层仍保留忽略大小写的重复检查。
任务 4:改进分页和排序测试
a. 相关提交或议题
N/A(本地工作区,未创建远程 PR/issue,提交哈希不可用)
b. PR 描述
新增分页、排序、筛选组合、CRUD、严格验证、错误格式、标签关系和扩展提取测试。分页覆盖空数据库、刚好越界、远端越界、首页/末页及非法上下界;排序覆盖升序、降序和自定义字段;组合筛选覆盖笔记的 q + tag 与行动项的 completed + q。相同排序值增加 id 次排序,保证分页稳定。
c. Graphite Diamond 审查结果
本地 Diamond 风格复核结论:测试覆盖了任务要求的可观察行为。
- 测试直接断言返回顺序和空页,不只检查状态码。
- 非法
skip/limit/sort均断言 422 和统一错误结构。 - 组合筛选数据同时包含应命中和不应命中的记录,能发现条件被错误地用 OR 连接。
- 受作业约束,本次只编写测试,没有执行 Python 或 pytest;因此不声称测试已运行通过。
简短反思
a. 人工审查通常关注什么
我先看正确性和 API 契约:状态码是否准确、更新和删除是否覆盖不存在资源、分页是否稳定。然后看数据完整性、输入边界、安全输出和测试是否能捕获真实回归。命名、格式等非阻塞意见最后处理。
b. 各任务中人工意见与 AI 风格意见的比较
- 任务 1:人工重点是完整 CRUD、空 PATCH 和一致错误结构;AI 风格复核更容易系统列出额外字段、严格布尔值和排序白名单等输入面。
- 任务 2:人工重点是规则冲突,例如
@high不能成为负责人;AI 风格复核更擅长罗列日期写法,但需要人工限定“轻量启发式”的范围。 - 任务 3:人工重点是关系生命周期与接口是否好用;AI 风格复核补充了跨数据库大小写唯一性和迁移工具建议。
- 任务 4:人工重点是测试能否因真实缺陷失败;AI 风格复核适合按空页、越界、正反排序、组合条件逐项检查遗漏。
c. AI 审查的优势和不足
优势是覆盖面快。例如它能一次提醒非法排序、limit=0、limit=201 和远端空页,而人工容易只检查正常分页。不足是容易给出超出作业范围的通用建议,例如立刻引入完整 NLP 库或迁移框架;这些建议不一定值得当前复杂度。@high 与负责人冲突、相对日期测试需要固定 today,仍依赖理解实际规则的人做判断。
d. 未来如何信任 AI 审查
我会把 AI 当作第二检查表,不当作最终批准者。低风险、可由测试直接证明的命名、遗漏分支和常见边界可以较多依赖 AI;涉及数据迁移、权限、安全、并发、日期语义或破坏性 API 变更时,必须人工阅读实现并运行针对性场景。经验法则是:若错误会丢数据、泄露信息或改变公开契约,就不能仅凭 AI 的“未发现问题”合并。