Skip to content

Latest commit

 

History

History
185 lines (144 loc) · 11.5 KB

File metadata and controls

185 lines (144 loc) · 11.5 KB

Session 2026-06-11 — Sprint 1 / 2 / 3 推进

23 个 commit · 跨 5.5 小时(09:44 – 15:12)· 从 Sprint 1 起步推到 Sprint 3 收官。

概览

阶段 时间 commit 数
Sprint 1 — 持久化 & 会话态 09:44 – 10:42 7
Sprint 2 — FastAPI HTTP 层 10:47 – 11:15 6
Sprint 3 — Milvus + RAG 11:27 – 15:12 9
中段切 LLM provider 到 OpenAI 12:03 1

数据源:git log --since='2026-06-11 00:00'。本文档不包含未 commit 的中间探索与 monkey-patch 诊断过程,那部分见对话本身。


时间线

Sprint 1 — 持久化与会话态(Postgres + Redis)

09:44 · b099c16 · chore: init repo with Sprint 0 walking skeleton

项目首个 commit,把 Sprint 0 骨架代码全部入库。16 个文件 / 1114 行。

  • 新增ARCHITECTURE.md CLAUDE.md sprint.md pyproject.toml .env.example .gitignore
  • 新增src/{schemas, llm, agents/{planner,interviewer,evaluator,analyzer}, orchestrator, main.py}
  • 安全注意:把 .env.example 里之前误存的真实 ANTHROPIC_API_KEY 脱敏。

09:47 · 6a5f456 · feat(db): add Postgres ORM

SQLAlchemy 2.0 + psycopg3 接入。两张表 + ORM + repository。

  • 新增src/db/{base,models,repository}.pysrc/db/__init__.py
  • pyproject.toml (+sqlalchemy, +psycopg)、.env.example (+POSTGRES_URL)
  • 设计:JSONB 存嵌套结构,顶层可索引字段提列。本地 round-trip 验过。

10:02 · df5a878 · feat(cache): add Redis session hot store

进行中的 InterviewSession 走 Redis 热存储 + TTL。

  • 新增src/cache/{base,session_store}.pysrc/cache/__init__.py
  • pyproject.toml (+redis)、.env.example (+REDIS_URL, +SESSION_TTL_SECONDS)
  • 设计:session:{id} 整体 JSON,与 PG 配合:"Redis 进行中 / PG 归档"。

10:26 · 1dc881e · docs: refresh CLAUDE.md

/init 改造 + Sprint 1 同步:补真实命令、加 5 条「关键设计模式」、删「(计划)」标记。

  • CLAUDE.md (+92 / -40)

10:27 · 9c657e1 · chore(hooks): log file operations and conversation turns

项目级 hooks 配置。注:实际上只有 Stop hook 在工作,PostToolUse 没注册成功(本 session 末才发现)。

  • 新增.claude/settings.json(PostToolUse Write/Edit/NotebookEdit + Stop)

10:27 · 7e65a9c · feat(orchestrator): refactor to Redis-backed state machine

Orchestrator 三段式 API:start_session / submit_answer / resume_session / finalize,加 run_interview() 便利封装保 Sprint 0 接口。

  • 新增src/cache/plan_store.py
  • src/orchestrator/__init__.py (+200/-54)、src/cache/{base,session_store,__init__}.pysrc/schemas/__init__.py (+TurnResult)
  • 设计:session 与 plan 同 TTL 同生共死;finalize 归档 PG + 清 Redis。中断恢复验过。

10:38 · 089c529 · feat(llm): cache responses in Redis

透明 LLM 缓存。stub 不入缓存;Redis 不可用静默降级。

  • 新增src/cache/llm_cache.py
  • src/llm/__init__.pysrc/cache/__init__.py.env.example (+LLM_CACHE_TTL_SECONDS)
  • 验证:monkey-patch anthropic.Anthropic 计数 → 3 次 complete → 2 次 API。

10:42 · 0756b3a · feat(evals): structural guardrails + compliance invariants

第一个 eval。15 个 TestCase,含合规分区不变量护栏。

  • 新增evals/test_skeleton.py 229 行、evals/__init__.py
  • CLAUDE.md (+11 / -2) 补 eval 命令段

Sprint 2 — API 层(FastAPI)

10:47 · e0c9d8c · feat(api): bootstrap FastAPI skeleton with /health

应用工厂 + 健康检查端点。

  • 新增api/{__init__,main}.pyevals/test_api.py(3 个 TestClient 冒烟)
  • pyproject.toml (+fastapi, +uvicorn)、CLAUDE.md

10:54 · 618858c · feat(db): add jobs / candidates / interview_plans tables

3 张新表 + ORM + repository。FK 全 ondelete=RESTRICT。

  • 新增evals/test_repository.py(8 个 round-trip / FK 护栏 / setUpClass 自动 init_db)
  • src/db/{models,repository,__init__}.pysrc/schemas/__init__.py (+CandidateProfile.job_id Optional)

10:58 · 44204b3 · feat(api): POST /jobs + 异常映射基础设施

第一个业务端点 + 集中异常映射。

  • 新增api/{schemas,exceptions}.pyapi/routes/{__init__,jobs}.py
  • api/main.pyevals/test_api.py (+CreateJobTests + ExceptionMappingTests)
  • 映射:DatabaseNotConfigured / RedisNotConfigured → 503。

11:03 · bc17b5c · feat(api): POST /candidates with async Planner trigger

候选人上传 → 202 + BackgroundTasks 跑 Planner 并双写 PG+Redis。

  • 新增api/routes/candidates.py
  • api/{schemas,main}.pysrc/db/{repository,__init__}.py (+load_latest_plan_for_candidate)、evals/test_api.py (+CreateCandidateTests)
  • 设计:plan 存在性作为就绪信号(不加 status 列);轮询 GET .../plan

11:11 · fed2e17 · feat(api): interview session three-step endpoints

POST /interviews + POST /answers + GET /interviews/{id}

  • 新增api/routes/interviews.py
  • api/{exceptions,schemas,main}.pysrc/orchestrator/__init__.py (+plan 可选参数避免重跑 planner)、evals/test_api.py (+10 个 InterviewSessionTests)
  • 修隐性 bug:API 路径强制传 PG 里的 plan,避免 orchestrator 重跑 planner 产出新 plan_id 漂移。

11:15 · 5269ec1 · feat(api): GET /interviews/{id}/report — Sprint 2 complete

隐式 finalize + 幂等报告。Sprint 2 收官。

  • api/routes/interviews.pysrc/{db,orchestrator}/__init__.py (+get_report)、evals/test_api.py (+5 个测试)、sprint.md (Sprint 1 + 2 全勾)

Sprint 3 — 题库与向量检索(Milvus + RAG)

11:27 · 9457c0e · feat(embeddings): OpenAI embedding wrapper + Redis cache

OpenAI text-embedding-3-small 的镜像 src/llm 设计:stub 降级 + Redis 缓存。

  • 新增src/embeddings/__init__.pysrc/cache/embedding_cache.pyevals/test_embeddings.py(8 个新 eval)
  • pyproject.toml (+openai)、.env.example (+OPENAI_*)、src/cache/__init__.py
  • 设计:stub 向量 = 全零;is_stub_vector() 让调用方在入 Milvus 前判断是否跳过。

11:36 · e17de0a · feat(vector_store): Milvus Lite + collections

惰性 MilvusClient + questions / documents 两个 collection。

  • 新增src/vector_store/{__init__,base,collections,operations}.pyevals/test_vector_store.py(10 个 eval)
  • pyproject.toml (+pymilvus, +milvus-lite)、.gitignore (+milvus_lite*)、.env.example
  • 踩坑:pymilvus 的 ORM import 时读 MILVUS_URI 当 http URL 解析 → 用 MILVUS_LITE_URI 避开。

11:47 · f094085 · feat(seeds): backend question bank + PG/Milvus dual-write

LLM 生成(或 fallback 模板)→ PG → embed → Milvus。可重跑(内容哈希 question_id)。

  • 新增scripts/{__init__,seed_questions}.pyevals/test_seed_questions.py(9 个 eval)
  • src/db/{models,repository,__init__}.py (+SeedQuestionORM 表)、src/schemas/__init__.py (+SeedQuestion)
  • 踩坑:pymilvus 还会 load_dotenv() 把 .env 塞回 env → eval 的 OPENAI_API_KEY pop 必须放 setUp,不能在模块顶。

12:03 · 2610fa5 · refactor(llm): switch from Anthropic to OpenAI

LLM 切到 OpenAI Chat Completions(默认 gpt-4o-mini),删 anthropic 依赖。

  • src/llm/__init__.py.env.example (-ANTHROPIC_* +OPENAI_CHAT_MODEL)、pyproject.toml (-anthropic)、CLAUDE.md 6 处同步、evals/test_skeleton.py (pop OPENAI 而非 ANTHROPIC)
  • 顺手修 monkey-patch 泄漏:test_embeddings.py 之前没 restore openai.OpenAI,LLM 切到 openai 才暴露。

12:13 · bbba794 · feat(ingestion): chunk + embed + Milvus

中文友好滑动窗口切片(~500 + 50 overlap);三个独立 ingest(JD / 公司资料 / Resume)。

  • 新增src/ingestion/{__init__,chunker,pipeline}.pyevals/test_ingestion.py(11 个 eval)
  • api/routes/{jobs,candidates}.py 挂 BG 任务

13:57 · 9ae1691 · feat(planner): knowledge questions via Milvus retrieval + LLM refinement

Planner 的 knowledge 题:题库召回 + LLM 精修。四级 fallback。

  • 新增evals/test_planner_rag.py(5 个 eval:hit / miss / role_family mismatch / stub embed skip)
  • src/agents/planner/__init__.py (+127 / -18)、src/schemas/__init__.py (+Question.source_question_id, +JobContext.role_family)

14:59 · b416bca · feat(planner): project questions via Resume chunk RAG

Planner 的 project 题:Resume 切片 RAG + LLM 围绕具体内容生成。

  • src/agents/planner/__init__.py (+95 / -15)、src/schemas/__init__.py (+Question.source_chunk_ids)、evals/test_planner_rag.py (+3 个 eval:hit / no ingest / 跨候选人隔离)

15:06 · 5ca5c94 · feat(evaluator): RAG-aware summary with JD/company context

Evaluator summary 接 JD + 公司资料 RAG;合规护栏:overall 严格不受 RAG 影响。

  • 新增evals/test_evaluator_rag.py(5 个 eval:含合规不变量 + 跨 job 隔离 + PG round-trip)
  • src/agents/evaluator/__init__.py (+115 / -14)、src/db/{base,models,repository}.py (+rag_context_chunk_ids 列 + 增量迁移 _apply_incremental_migrations)、src/schemas/__init__.py

15:12 · 66abac1 · feat(evals): end-to-end RAG provenance + isolation — Sprint 3 complete

API 驱动端到端 + 综合跨 job/candidate 隔离。Sprint 3 收官。

  • 新增evals/test_rag_e2e.py(3 个 eval:全链路 provenance / 跨 job resume / 跨 job JD)
  • api/routes/candidates.py(修隐性 bug:BG 任务顺序应当是 ingest_resume → planner,FastAPI BackgroundTasks 是顺序执行而非并行)、sprint.md

关键模块(按行数)

路径 行数
src/orchestrator/__init__.py ~230
src/agents/planner/__init__.py ~245
src/agents/evaluator/__init__.py ~210
src/db/{base,models,repository}.py ~360
src/cache/{base,session_store,plan_store,llm_cache,embedding_cache}.py ~280
src/vector_store/{base,collections,operations}.py ~340
src/ingestion/{chunker,pipeline}.py ~150
api/routes/{jobs,candidates,interviews}.py ~210
evals/test_*.py ~2000(111 个 TestCase)

这一天发现 / 修的隐性 bug

发现 修法 修在
.env.example 里有真实 ANTHROPIC_API_KEY 脱敏 + 提醒轮换 b099c16
orchestrator.start_session 重跑 planner 导致 plan_id 漂移 加可选 plan 参数 fed2e17
pymilvus.settings import 时 load_dotenv() 把 .env 塞回 env eval setUp 里再 pop f094085
pymilvus 把 MILVUS_URI 当 http URL 解析 MILVUS_LITE_URI 避开 e17de0a
test_embeddings 没 restore openai.OpenAI,LLM 切 openai 才暴露 tearDown 恢复 2610fa5
POST /candidates BG 顺序错:planner 先于 ingest_resume,Resume RAG 沉默失效 调换顺序 + 注释 66abac1
.claude/settings.json 的 PostToolUse hook 没注册成功(Stop 工作) 未修,待 update-config 处理

未解决项 / 持续累积

  • datetime.utcnow() deprecation(Python 3.14 + pydantic)
  • psycopg ResourceWarning(进程退出 engine 没显式 dispose)—— Sprint 4 接 FastAPI lifespan 时一并处理
  • FastAPI BackgroundTasks 是顺序非并行 —— Sprint 7 接 RQ/Celery 真正并行化
  • PostToolUse hook 没在工作 —— 需 update-config 修 + /hooks 重载