NoeVault Snip Architecture

NoeVault Snip Architecture

NoeVault Snip Architecture

NoeVault Snip Architecture Guide

Authority: PR-8.7D freeze · Experience convergence PR-8.7E · Package @noevault/snap 1.1.3
System of record: SupportTicket (+ comments + evidence)

Purpose

NoeVault Snip is the platform product that embeds issue reporting, screenshot evidence, and requester conversation into external and native NoeVault experiences — under a single identity and licensing model.

High-level topology

┌──────────────────────────┐     ┌──────────────────────────────┐
│ External app (KitchenPro)│     │ NoeVault Admin Panel         │
│  - App session auth      │     │  - Platform / Org operators  │
│  - Trusted bootstrap BFF │     │  - SnapWorkspace / tickets   │
│  - @noevault/snap host   │     │  - Shared SnapScreenEditor   │
└────────────┬─────────────┘     └──────────────┬───────────────┘
             │                                  │
             │  browser-safe bootstrap          │ JWT / panel session
             │  credentials-omit where required │
             ▼                                  ▼
        ┌────────────────────────────────────────────┐
        │              NoeVault API                  │
        │  SupportTickets · SnapSupport workspace    │
        │  Effective categories · RequireApiAuth     │
        └────────────────────┬───────────────────────┘
                             ▼
        ┌────────────────────────────────────────────┐
        │     SupportTicket SoR (comments/evidence)  │
        │     ExternalRequester / ExternalSubject    │
        └────────────────────────────────────────────┘

Identity model (Model B)

Actor Identity UserUID Seats / OLEA
External requester (KitchenPro user) ExternalRequester + stable subject (KP-USER-*) None None
Panel operator / Platform Admin NoeUser Yes Normal panel licensing
Genuine system events Display as System only when no user and no requester

Empty AuthorUserUID / uploadedBy on ExternalRequester-owned tickets is correct Model B behaviour, not missing data.

See .

Shared UX components

Component Role
SnapScreenEditor Capture preview, expand/Precision workspace, zoom/fit, toolbar
AnnotationSession Single annotation edit graph (undo/redo/crop/redact/shapes)
AttachmentPicker Drag/drop/paste/preview/remove
createConversationPoller Soft poll of ticket detail (no SignalR)
Panel bridge snap-screen-shared-editor.js Mounts shared editor when UMD present

Annotations flatten to PNG before upload. Post-submission annotation editing is not supported.

Capability and product grains

Layer Code Meaning
Commercial product support_snap Entitlement / catalogue product
Runtime capability support.snap Capability family
Example grain support.snap.report Reporting path used by hosts

Category inheritance

Solutions inherit and refine support categories. Composer options come from the effective category projection — not a parallel category store in the SDK.

See .

Security boundaries (summary)

  • AppKey / secrets never reach the browser.
  • Anonymous bootstrap fails closed.
  • RequireApiAuth Snap correction remains authoritative for credentials-omit create paths where designed.
  • Ticket access is evaluated per actor (ExternalRequester vs staff) — no cross-tenant leakage by design.

See .

What this architecture deliberately does not include

  • SignalR for ticket conversation
  • Creating NoeVault users for external requesters on submit
  • Seat consumption or OLEA rows for ExternalRequester traffic
  • A second conversation or annotation system of record