From 521646f312c47bef76f7ef1c5efa907ac623e628 Mon Sep 17 00:00:00 2001 From: Chandler Copeland Date: Thu, 19 Mar 2026 21:24:01 -0600 Subject: [PATCH] docs(04): research phase PDF ingest domain --- .planning/phases/04-pdf-ingest/04-RESEARCH.md | 475 ++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 .planning/phases/04-pdf-ingest/04-RESEARCH.md diff --git a/.planning/phases/04-pdf-ingest/04-RESEARCH.md b/.planning/phases/04-pdf-ingest/04-RESEARCH.md new file mode 100644 index 0000000..49e26d8 --- /dev/null +++ b/.planning/phases/04-pdf-ingest/04-RESEARCH.md @@ -0,0 +1,475 @@ +# Phase 4: PDF Ingest - Research + +**Researched:** 2026-03-19 +**Domain:** PDF file ingestion, SkySlope/URE forms API investigation, PDF rendering, file storage +**Confidence:** MEDIUM + +## Summary + +Phase 4 adds document management to the agent portal: pulling PDF forms from the SkySlope/URE forms library, copying them into a client-specific storage folder, and rendering them in the browser. The critical unknown going into this phase was whether the utahrealestate.com vendor API exposes a forms library. Research confirms the URE Web API is a **RESO OData v4 MLS listing data API** — it does not expose forms/PDF downloads. The SkySlope forms integration is a member-facing web application (skyslope.utahrealestate.com), not a programmatic API accessible to third-party apps. There is no public SkySlope API for fetching form PDFs. + +The practical conclusion: forms must be seeded manually. An agent (or developer) downloads the relevant forms from the SkySlope member portal and places them in a seed directory. The application reads that seed directory to populate the forms library. A cron job or manual re-seed script handles the monthly sync requirement (DOC-02). This approach is explicitly called out in REQUIREMENTS.md as the fallback if the vendor API does not expose forms — and it does not. + +For PDF rendering, PDF.js (mozilla/pdf.js) is the correct choice. It renders PDFs natively in the browser with no iframe/plugin quirks, and — critically — it provides a canvas-based layer system that Phase 5 field overlay work will build on. Using a raw `