## 背景(#517) PDF インポート ADR(前段 issue)に従い、backend のエンドポイントを実装する。 ## 作業内容(PR 1本) - [ ] PDF テキスト抽出(ADR で選定したライブラリ)。依存追加 → `uv lock` 再生成・`backend/uv.lock` コミット - [ ] テキスト埋め込み有無の判定。スキャン PDF は `messages.json` の日本語メッセージで非対応エラーを返す - [ ] `services/agent/` 配下に抽出サービスを実装: - 構造化出力で Resume スキーマ互換の payload を返す(Haiku) - Agent の不変条件を継承: 機械制約はスキーマ / 品質制約はプロンプト(プロンプトは `app/prompts/`)、リトライ 1 回、LLMError / パース失敗は 502 の日本語エラー契約 - **DB 非更新**: レスポンスは payload のみ。保存はユーザがフォームから実行 - [ ] エンドポイント追加(multipart upload)。ファイルサイズ上限・PDF 以外の拒否のバリデーション - [ ] レート制限(#521)の対象に組み込む - [ ] 決定論部分(テキスト前処理・判定ロジック)は **TDD 対象** - [ ] `make codegen-types` 再生成・コミット ## 受け入れ条件 - `make ci` green - テキスト PDF で Resume 互換 payload が返り、スキャン PDF・非 PDF・サイズ超過がそれぞれ日本語エラーで区別される - **作業前に `.claude/rules/backend/agent.md` を読むこと**(Agent 変更時の必須ルール)
背景(#517)
PDF インポート ADR(前段 issue)に従い、backend のエンドポイントを実装する。
作業内容(PR 1本)
uv lock再生成・backend/uv.lockコミットmessages.jsonの日本語メッセージで非対応エラーを返すservices/agent/配下に抽出サービスを実装:app/prompts/)、リトライ 1 回、LLMError / パース失敗は 502 の日本語エラー契約make codegen-types再生成・コミット受け入れ条件
make cigreen.claude/rules/backend/agent.mdを読むこと(Agent 変更時の必須ルール)