{"slug":"platform/04-projection-engine","title":"04 — Projection Engine","section":"platform","sectionLabel":"Platform","status":"unclassified","type":"document","path":"platform/04-projection-engine.mdx","bytes":1444,"description":null,"updated":null,"source":"integratewise/Integratewise-docs-wiki","content":"\n> **Extracted from:** IntegrateWise Platform Specification Suite\n> **Region:** first_pass\n> **Original line:** 753\n> **Lines:** 27 | **Chars:** 1,147\n> **Status:** Raw extraction — requires review and canonicalization\n\n04 — Projection Engine\n4.1 Responsibilities\nProject the Spine into Workbench, Persona, Workspace, and React components.\nOwn cursor strategy, pagination, widget layouts, and per-persona defaults.\n4.2 Pipeline\nCopySpine (02) ──▶ Projection Engine ──▶ Persona (06) ──▶ Workspace (03) ──▶ React Components (18)\n4.3 Inputs\nSpine reads (with as*of).\nPersona fits from tenant_spine_config.\nWorkspace layout ref.\nUser viewport, locale, density.\n4.4 Outputs\nRender-tree JSON (workbench), iframe-bundle (webview), push payload (mobile/Slack).\n4.5 Events\nProduced: ProjectionBuilt, ProjectionStale, ProjectionInvalidated.\nConsumed: every evt*… from Spine (02), PersonaChanged, WorkspaceSwitched.\n4.6 APIs\nPOST /project/build, GET /project/{prj_id}?as_of=…, POST /project/{prj_id}/invalidate.\n4.7 State transitions\npending → building → fresh → stale → invalid → fresh.\n\n4.8 Failure handling\nIncomplete Spine data → render safe-empty with explicit chip (“Evidence partial”).\nPersona mismatch → render lockout (Persona Barrier).\n4.9 Extension points\nCustom widget renderer (Widget SDK, listed under 17).\nCustom projection transforms PROJECTION_TRANSFORM(name).\n"}