# Intentional Deviations from `instructions v2.md` This deployment closes the v2 spec gap while preserving the following locked decisions. ## Onboarding - **Spec:** `POST /api/upload/template` for tenant master upload + schema discovery. - **This deployment:** Operator PDF + Word bundle ingested at startup (`backend/startup.py`) plus optional gated `/admin/template` override. No tenant template upload route. ## LLM provider - **Spec:** Anthropic Claude (`anthropic_api_key`, `claude-sonnet-4-20250514`). - **This deployment:** OpenAI via `backend/llm/openai_client.py` (`openai_api_key`, `gpt-4o-mini` defaults). ## Embeddings - **Spec:** OpenAI `text-embedding-3-small` only. - **This deployment:** Configurable `embedding_provider` with local `all-MiniLM-L6-v2` default. ## Surveyor notes (Security #1) - **Spec:** Scrub `raw_notes` before any LLM call; middleware may return 400 on PII in requests. - **This deployment:** Notes are parsed **verbatim**. Request middleware logs EMAIL/POSTCODE but does not block. PII scrubbing applies to REFERENCE RAG ingest and generated DOCX output. ## Generation RAG - **Spec:** Allows REFERENCE tier as style fallback during mapping. - **This deployment:** Mapping is sourced from each tenant's **own past reports (REFERENCE tier)** at every interference level via `search_for_reference_mapping()`. The shared MASTER boilerplate is **disabled by default** (`master_template_auto_ingest=false`); `search_for_generation()` (MASTER-only) remains for explicit opt-in but is not in the default path. Per-tenant isolation: a tenant only ever retrieves its own scrubbed reports. ## Legacy `app/` The original `app/` package is untouched. All v2 work lives under `backend/`. ## Additional extensions (beyond spec) | Feature | Route / setting | |---------|-----------------| | JWT auth | `/auth/register`, `/auth/login` | | Health | `GET /health` with `reference_ready` + FAISS counts | | Admin reingest | `POST /admin/template/reingest` |