Files
red/.planning/phases/13-ai-field-placement-and-pre-fill/13-04-PLAN.md
Chandler Copeland df4676c23c docs(13): create phase 13 AI field placement plan
4 plans in 4 sequential waves covering:
- Plan 01 (TDD): openai install, extract-text.ts, field-placement.ts, aiCoordsToPagePdfSpace unit test
- Plan 02: POST /api/documents/[id]/ai-prepare route with all guards
- Plan 03: UI wiring — aiPlacementKey in FieldPlacer, AI Auto-place button in PreparePanel
- Plan 04: Unit test gate + human E2E verification checkpoint

Satisfies AI-01, AI-02. Completes v1.1 Smart Document Preparation milestone.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 16:54:43 -06:00

201 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
phase: 13-ai-field-placement-and-pre-fill
plan: 04
type: execute
wave: 4
depends_on:
- 13-01
- 13-02
- 13-03
files_modified: []
autonomous: false
requirements:
- AI-01
- AI-02
must_haves:
truths:
- "Agent can click 'AI Auto-place Fields' on a real document and fields appear on the PDF canvas"
- "AI-placed text fields are pre-filled with client name and/or property address where available"
- "AI-placed fields are editable — agent can move, resize, and delete them after AI placement"
- "Coordinate conversion is correct — fields appear at the expected vertical positions (not inverted)"
- "Unit test passes: aiCoordsToPagePdfSpace produces correct Y-axis flip for US Letter dimensions"
artifacts:
- path: "teressa-copeland-homes/src/lib/pdf/__tests__/ai-coords.test.ts"
provides: "Passing unit tests for coordinate conversion"
contains: "aiCoordsToPagePdfSpace"
key_links:
- from: "AI Auto-place button"
to: "/api/documents/[id]/ai-prepare"
via: "PreparePanel onAiAutoPlace → DocumentPageClient handleAiAutoPlace → fetch POST"
pattern: "ai-prepare"
- from: "FieldPlacer"
to: "DB (signatureFields)"
via: "loadFields useEffect re-runs when aiPlacementKey increments"
pattern: "aiPlacementKey"
---
<objective>
Verify the complete AI field placement feature end-to-end: unit tests, integration test with a real document, coordinate accuracy check, and final human UAT sign-off.
Purpose: AI coordinate accuracy on real Utah forms is listed as an explicit concern in STATE.md Blockers/Concerns. This plan is the mandatory verification gate before Phase 13 ships.
Output: Human-verified AI field placement on a real document. Phase 13 complete.
</objective>
<execution_context>
@/Users/ccopeland/.claude/get-shit-done/workflows/execute-plan.md
@/Users/ccopeland/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/13-ai-field-placement-and-pre-fill/13-RESEARCH.md
@.planning/phases/13-ai-field-placement-and-pre-fill/13-01-SUMMARY.md
@.planning/phases/13-ai-field-placement-and-pre-fill/13-02-SUMMARY.md
@.planning/phases/13-ai-field-placement-and-pre-fill/13-03-SUMMARY.md
</context>
<tasks>
<task type="auto">
<name>Task 1: Run unit tests and TypeScript build check</name>
<files></files>
<action>
Run the full test suite for the AI coordinate conversion and confirm TypeScript compiles clean:
```bash
cd /Users/ccopeland/temp/red/teressa-copeland-homes
npx jest src/lib/pdf/__tests__/ai-coords.test.ts --no-coverage --verbose
npx tsc --noEmit
```
If any test fails:
- Re-read the formula in `aiCoordsToPagePdfSpace` against FieldPlacer.tsx lines 289-290
- The expected values in the test file are authoritative — fix the implementation, not the tests
- Re-run until GREEN
If TypeScript errors:
- Fix them (likely missing prop types or import errors)
- Re-run `npx tsc --noEmit` until clean
Do NOT proceed to the checkpoint task until both commands pass cleanly.
</action>
<verify>
<automated>cd /Users/ccopeland/temp/red/teressa-copeland-homes && npx jest src/lib/pdf/__tests__/ai-coords.test.ts --no-coverage --verbose && npx tsc --noEmit</automated>
</verify>
<done>All aiCoordsToPagePdfSpace test cases PASS. TypeScript compiles with no errors. Ready for human verification.</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<name>Task 2: Human E2E verification of AI field placement</name>
<action>Human verifies the complete AI auto-place feature end-to-end on a real document at localhost:3000.</action>
<what-built>
Complete AI field placement feature:
- "AI Auto-place Fields" button (violet) in PreparePanel for all Draft documents
- POST /api/documents/[id]/ai-prepare route that extracts PDF text, calls GPT-4o-mini, converts coordinates, writes fields to DB
- FieldPlacer re-fetches from DB after AI placement (aiPlacementKey increment)
- Text fields pre-filled from client profile (name, property address) where available
- Unit test: aiCoordsToPagePdfSpace Y-axis flip verified for US Letter 612×792 pts
</what-built>
<how-to-verify>
Before running this test, ensure:
- `.env.local` in the teressa-copeland-homes directory has `OPENAI_API_KEY=sk-...` set
- `npm run dev` is running at localhost:3000
**Step 1: Verify the "AI Auto-place Fields" button appears**
- Open any Draft document in the portal: http://localhost:3000/portal/documents/[any-draft-docId]
- Confirm the violet "AI Auto-place Fields" button is visible in the PreparePanel (above the gray "Preview" button)
- Confirm it is NOT visible for non-Draft documents (Sent/Signed)
**Step 2: Test AI auto-place on a simple document**
- Choose a Draft document with a PDF that has visible form fields (any uploaded PDF)
- Click "AI Auto-place Fields"
- Expected: Button shows "AI placing fields..." during the request
- Expected: After completion, field overlays appear on the PDF canvas representing AI-placed fields
- Confirm field overlays appear — even if placement is imperfect, at least some fields should appear
**Step 3: Verify field editability (AI-01 success criterion)**
- Click on one of the AI-placed text field overlays — confirm it selects (blue ring appears)
- Try moving a field to a different position — confirm drag-and-drop works
- Try deleting a field (click x) — confirm it deletes
- Confirm the remaining fields still show after delete
**Step 4: Verify text pre-fill (AI-02)**
- If the document has an assigned client with a name and property address, open that document
- Click "AI Auto-place Fields"
- After completion, check the PreparePanel quick-fill area — click a text field
- Expected: The field value is already populated with client name or property address (if AI detected a matching field)
- Note: AI may not always pre-fill — this is best-effort. As long as the mechanism works when AI returns a prefillValue, it passes.
**Step 5: Verify Y-axis coordinate accuracy (AI-01 success criterion)**
- Place a known field manually at 10% from top on a real PDF, note its visual position
- Use AI auto-place on the same PDF
- Expected: AI-placed fields should appear at roughly correct vertical positions (not inverted/flipped to bottom)
- If fields appear at bottom when they should be at top, flag as a coordinate bug (do not approve)
**Step 6: Verify preview and prepare still work after AI placement**
- After AI auto-place, click "Preview" — confirm preview generates successfully
- Confirm the preview PDF shows the AI-placed fields
- Note: You do NOT need to click "Prepare and Send" for this verification
**Step 7: Verify error state**
- Temporarily set an invalid OPENAI_API_KEY in .env.local (e.g., OPENAI_API_KEY=invalid)
- Restart dev server, click "AI Auto-place Fields"
- Expected: An error message appears in PreparePanel (red text) — it should NOT crash the page
- Restore the correct API key afterward
</how-to-verify>
<verify>
<automated>MISSING — this is a human-verify checkpoint; automated verification is Step 7 above (error state test)</automated>
</verify>
<done>Human approves all 7 verification steps. AI-01 and AI-02 verified. Phase 13 complete.</done>
<resume-signal>
Type "approved" if all 7 steps pass. Describe any issues (especially Y-axis inversion in Step 5 or field editability failures in Step 3) and I will diagnose and fix.
Known acceptable limitations:
- AI may not place fields on every form perfectly — imprecise positions are acceptable as long as they are in the correct vertical region
- AI may not pre-fill text fields if it does not detect matching labels — that is acceptable
- Very long PDFs (20+ pages) may take 10-20 seconds — that is acceptable
Blocking failures (do NOT approve):
- Fields appear at inverted Y positions (Step 5) — this means aiCoordsToPagePdfSpace has a bug
- Fields cannot be moved or deleted after AI placement (Step 3)
- Page crashes or 500 error without user-visible error message
- "AI Auto-place Fields" button does not appear for Draft documents (Step 1)
</resume-signal>
</task>
</tasks>
<verification>
- All aiCoordsToPagePdfSpace unit tests pass
- TypeScript compiles clean: npx tsc --noEmit
- AI Auto-place button visible in PreparePanel for Draft documents
- AI placement populates FieldPlacer with field overlays from DB
- Fields are movable/resizable/deletable after AI placement
- Text pre-fill from client profile works when AI detects matching fields
- Error state visible (not a crash) when API key is missing/invalid
- Human approved all 7 verification steps
</verification>
<success_criteria>
- Unit tests green (aiCoordsToPagePdfSpace)
- TypeScript clean build
- Human approves Steps 1-7:
- AI Auto-place button appears for Draft docs
- Fields appear on canvas after AI placement
- Fields are editable (move, resize, delete)
- Y-axis coordinates are correct (not inverted)
- Preview and prepare-and-send still work after AI placement
- Error state shown (not crash) when API key invalid
- AI-01 satisfied: one-click button places field types from PDF analysis
- AI-02 satisfied: text fields pre-filled with client data where AI detects match
- Phase 13 complete — v1.1 Smart Document Preparation milestone fully shipped
</success_criteria>
<output>
After completion, create `.planning/phases/13-ai-field-placement-and-pre-fill/13-04-SUMMARY.md`
</output>