EXAM-20260730-02:仓库导入的分支与异步一致性
历史选题依据
最近练习已经能写出基本异步三态和提交边界,但仍需要证明以下能力可以迁移到新场景:
- 分清界面默认值、用户显式输入和接口返回值谁是当前数据源;
- 在组件关闭或身份变化后,阻止过期异步结果污染下一次交互;
- 从前端类型与调用点确认 payload,而不是用断言或猜测掩盖接口关系;
- 用自动化测试验证竞态与错误路径,并在提交前清理调试遗留。
Issue 背景
用户通过顶部入口导入 GitHub 仓库时,会先校验仓库,再确认分支并创建项目。这个流程必须保证最终导入的分支与用户看到的一致,也不能让已经关闭的旧请求影响下一次打开弹窗。
当前现象
从 Header 打开 “Import Repository” 弹窗,可以观察到两个问题:
- 当仓库默认分支不是
main,用户没有主动指定分支时,校验结果已经返回真实默认分支,但确认界面和最终导入仍可能继续使用main。 - 校验请求尚未结束时关闭弹窗,请求稍后完成仍可能写入旧预览;再次打开时可能看到上一轮仓库的状态。
验收标准
- [ ] 用户未显式填写分支时,校验成功后展示接口返回的分支,并在导入 payload 中提交同一个值。
- [ ] 用户在校验前显式填写了分支时,校验成功不得覆盖该选择,最终导入使用用户填写值。
- [ ] 校验请求进行中关闭弹窗后,该请求无论成功还是失败,都不能在关闭后或下一次打开时恢复旧预览、旧错误或旧 loading 状态。
- [ ] 返回编辑、修改仓库地址并重新校验时,只允许最新一次有效校验结果进入确认界面。
- [ ] 校验失败时用户能感知错误并可修改输入后重试;现有凭据缺失/失效的恢复入口保持可用。
- [ ] validation/import pending 期间不会因重复点击发出重复业务请求,按钮状态与可见文案能够表达当前阶段。
- [ ] 至少新增两条自动化回归测试,分别覆盖“接口默认分支被采用”和“关闭或新一轮校验后旧结果被忽略”;测试只验证前端行为或可测试状态逻辑。
- [ ] 目标范围通过 TypeScript 检查、lint、相关测试和
git diff --check,不留下临时日志、注释代码或无理由类型断言。
约束
- 只修改前端组件、Hook、前端工具函数和前端测试。
- 保持现有仓库校验接口与创建资源的公共契约,不改变调用方 Props。
- 不要求复刻翻译 key、精确文案或复杂样式;错误提示的可感知语义仍属于验收范围。
- 不新增运行时依赖。允许抽取小型纯函数或 Hook,但不要为单个弹窗引入全局状态。
不在范围内
- 不修改 tRPC router、GitHub 服务、数据库、DAO、认证、环境变量或 Worker。
- 不重构整个导入流程、Header 或通用 Dialog。
- 不实现远程分支列表选择器。
三阶段考试规则
- 实现交付(60 分):可以正常使用 Agent、IDE、仓库搜索与类型跳转,完成代码、测试和
交付说明.md。 - 代码答辩(掌握分的一部分):提交实现后,独立回答 4–6 个基于你真实 diff 的问题。可以看最终代码和类型定义,但不要让 Agent 代答,也不要查看此前 Agent 对话。
- 现场接管(掌握分的一部分):答辩结束后才会揭示一个 15–30 分钟的相邻变化或故障题。
交付至少 42/60、掌握至少 24/40 才算真正通过;高交付分不能抵消掌握未通过。
交付物
- 实现代码和自动化测试;
- 填写本目录中的
交付说明.md; - 完成后明确告诉考官“实现阶段已提交”,不要自行进入答辩或猜测变化题。
起始线索
从 Header 的 “Import Repository” 入口和 ImportRepositoryDialog 组件开始,先画出“输入 → 校验结果 → 确认预览 → 创建 payload”的状态流。
Git 基线与出题验证
- 基线提交:
4e03802a81989b0ae6da6ca775d9fa789a93e773 - 独立考试工作树:
C:\tmp\daedalus-exam-20260730-02 - 出题时工作树:干净、detached HEAD
- 已确认当前前端实现可复现至少两个核心现象;服务端文件只用于读取契约,不属于答题范围。