diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index e65883463..8ed9694f6 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -14,7 +14,7 @@ - **R&R and Keyman Missing**: (Resolved) LLM prompt updated to explicitly instruct using actual stated names rather than collective titles. - **Entity Resolution / Searxng**: Abbreviations like "한전" and "한국전력" are not mapped properly using Searxng and KG corroboration. - **Meso-level Team Mapping**: (Resolved) Checked extraction logic; `team` mapping logic is present and correct, but LLM needed better explicit instruction which is covered by R&R resolution. -- **Base64 Image Omni-modal**: Current text-only embedding fails on images. Omni-modal LLM processing is required for images to capture layout, font size, colors, and spatial meaning. +- **Base64 Image Omni-modal**: (Resolved) `lineageweave/image_content.py`'s `OpenAiCompatibleVisionClient` (wired via `_vision_client()`/`orchestrator_vision_client()` in `backend/app/main.py`, same contextual-orchestrator gateway as every other LLM channel) sends each embedded image to a vision-capable model and asks for OCR text, a caption covering "visible layout, objects, relationships, directions, measurements, and labels", and tags. `post_content_normalization.py` inlines that caption+OCR at the image's original position in the post body before chunking, so it reaches the normal (text) embedding pipeline rather than being silently dropped -- there is no image-native embedding, but the content is not text-only-blind either. Remaining, narrower gap: the caption prompt doesn't explicitly ask for font size or color as separate fields (only incidentally, if visually salient) -- worth a follow-up prompt tweak if that granularity is ever needed, but not the "current text-only embedding fails on images" state this entry originally described. ## 3. General Architecture Gaps - **DB Architecture**: Ensure PostgreSQL is strictly used (no file DBs), 3rd normal form is maintained, and Hot Partitions are handled. DB locks must be managed (or use read/write replicas). diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 7462abd2c..70eb27590 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -41,6 +41,9 @@ describe("App, unauthenticated", () => { state: expect.objectContaining({ returnUrl: expect.stringMatching(/^\//) }), }), ); + // Persisted as a fallback in case the OIDC state round-trip is dropped + // (see oidcReturnUrl.ts's restoreOidcReturnUrl, consumed in main.tsx). + expect(window.sessionStorage.getItem("lineageweave.oidc.returnUrl")).toMatch(/^\//); }); }); diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 6fba0dd41..1b5b351ab 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -4610,7 +4610,8 @@ export default function App({ showLabPanels = false }: { showLabPanels?: boolean
- {destination === "admin" ? : null}