{
  "schema": "ai-architect-reactflow/v1",
  "pattern": "grounded-research-desk",
  "provider": "gcp",
  "nodes": [
    {
      "id": "analyst",
      "type": "architecture",
      "position": {
        "x": 40,
        "y": 220
      },
      "data": {
        "label": "Analyst",
        "role": "user",
        "layer": "people",
        "detail": "Asks, reads, forwards or flags.",
        "dataClass": "internal",
        "service": "Person",
        "serviceId": null,
        "docs": null,
        "officialIcon": null
      }
    },
    {
      "id": "workspace",
      "type": "architecture",
      "position": {
        "x": 340,
        "y": 220
      },
      "data": {
        "label": "Research workspace",
        "role": "experience",
        "layer": "people",
        "detail": "Ask box, cited answer, passage viewer, flag action.",
        "dataClass": "internal",
        "service": "Cloud Run",
        "serviceId": "gcp.cloud-run",
        "docs": "https://cloud.google.com/run",
        "officialIcon": "cloud_run"
      }
    },
    {
      "id": "sso",
      "type": "architecture",
      "position": {
        "x": 340,
        "y": 40
      },
      "data": {
        "label": "Workforce sign-in",
        "role": "identity",
        "layer": "control",
        "detail": "SSO with group claims mapped to document permissions.",
        "dataClass": "identity",
        "service": "Identity-Aware Proxy",
        "serviceId": "gcp.iap",
        "docs": "https://cloud.google.com/security/products/iap",
        "officialIcon": null
      }
    },
    {
      "id": "answer-api",
      "type": "architecture",
      "position": {
        "x": 640,
        "y": 220
      },
      "data": {
        "label": "Answer API",
        "role": "api",
        "layer": "control",
        "detail": "Authorizes, scopes the corpus by permission, enforces a per-question budget.",
        "dataClass": "confidential",
        "service": "Cloud Run",
        "serviceId": "gcp.cloud-run",
        "docs": "https://cloud.google.com/run",
        "officialIcon": "cloud_run"
      }
    },
    {
      "id": "gateway",
      "type": "architecture",
      "position": {
        "x": 940,
        "y": 40
      },
      "data": {
        "label": "Model gateway",
        "role": "gateway",
        "layer": "control",
        "detail": "Routing, fallback, budget, cache and token logs.",
        "dataClass": "confidential",
        "service": "Apigee (AI gateway policies)",
        "serviceId": "gcp.apigee",
        "docs": "https://cloud.google.com/apigee",
        "officialIcon": null
      }
    },
    {
      "id": "model",
      "type": "architecture",
      "position": {
        "x": 1240,
        "y": 40
      },
      "data": {
        "label": "Generation model",
        "role": "model",
        "layer": "intelligence",
        "detail": "Writes only from supplied passages and returns passage IDs per claim.",
        "dataClass": "confidential",
        "service": "Gemini 3.8 Flash (Agent Platform)",
        "serviceId": "gcp.gemini",
        "docs": "https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/guides/gemini-3-8-flash",
        "officialIcon": "vertexai"
      }
    },
    {
      "id": "index",
      "type": "architecture",
      "position": {
        "x": 940,
        "y": 400
      },
      "data": {
        "label": "Hybrid retrieval index",
        "role": "retrieval",
        "layer": "knowledge",
        "detail": "Keyword and vector search with permission tags on every chunk.",
        "dataClass": "confidential",
        "service": "Agent Search",
        "serviceId": "gcp.agent-search",
        "docs": "https://cloud.google.com/products/gemini-enterprise-agent-platform/agent-search",
        "officialIcon": null
      }
    },
    {
      "id": "ingest",
      "type": "architecture",
      "position": {
        "x": 1240,
        "y": 400
      },
      "data": {
        "label": "Ingestion pipeline",
        "role": "ingest",
        "layer": "knowledge",
        "detail": "Parse, chunk, embed and copy source permissions to each chunk.",
        "dataClass": "confidential",
        "service": "RAG Engine (Agent Platform)",
        "serviceId": "gcp.rag-engine",
        "docs": "https://docs.cloud.google.com/gemini-enterprise-agent-platform/build/rag-engine/use-vertexai-search",
        "officialIcon": null
      }
    },
    {
      "id": "corpus",
      "type": "architecture",
      "position": {
        "x": 1540,
        "y": 400
      },
      "data": {
        "label": "Source corpus",
        "role": "objects",
        "layer": "knowledge",
        "detail": "Versioned documents with owners and review dates.",
        "dataClass": "confidential",
        "service": "Cloud Storage",
        "serviceId": "gcp.cloud-storage",
        "docs": "https://cloud.google.com/storage",
        "officialIcon": "cloud_storage"
      }
    },
    {
      "id": "ledger",
      "type": "architecture",
      "position": {
        "x": 640,
        "y": 400
      },
      "data": {
        "label": "Answer ledger",
        "role": "store",
        "layer": "knowledge",
        "detail": "Question, answer, passage IDs, model, cost and feedback.",
        "dataClass": "confidential",
        "service": "Firestore",
        "serviceId": "gcp.firestore",
        "docs": "https://cloud.google.com/firestore",
        "officialIcon": null
      }
    },
    {
      "id": "traces",
      "type": "architecture",
      "position": {
        "x": 1540,
        "y": 40
      },
      "data": {
        "label": "Traces and cost",
        "role": "observability",
        "layer": "assurance",
        "detail": "Latency, tokens, cache hits and refusals per team.",
        "dataClass": "operational",
        "service": "Cloud Logging, Monitoring, Trace",
        "serviceId": "gcp.observability",
        "docs": "https://cloud.google.com/products/observability",
        "officialIcon": null
      }
    },
    {
      "id": "evals",
      "type": "architecture",
      "position": {
        "x": 1540,
        "y": 220
      },
      "data": {
        "label": "Eval harness",
        "role": "evals",
        "layer": "assurance",
        "detail": "Frozen question set with expected passages and must-refuse cases.",
        "dataClass": "internal",
        "service": "Evaluation service (Agent Platform)",
        "serviceId": "gcp.evaluation",
        "docs": "https://docs.cloud.google.com/gemini-enterprise-agent-platform",
        "officialIcon": "vertexai"
      }
    }
  ],
  "edges": [
    {
      "id": "ask",
      "source": "analyst",
      "target": "workspace",
      "label": "Question",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "internal"
      }
    },
    {
      "id": "signin",
      "source": "workspace",
      "target": "sso",
      "label": "SSO and group claims",
      "type": "smoothstep",
      "animated": false,
      "data": {
        "kind": "control",
        "dataClass": "identity"
      }
    },
    {
      "id": "request",
      "source": "workspace",
      "target": "answer-api",
      "label": "Question with scope token",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "internal"
      }
    },
    {
      "id": "retrieve",
      "source": "answer-api",
      "target": "index",
      "label": "Permission-filtered query",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "generate",
      "source": "answer-api",
      "target": "gateway",
      "label": "Prompt with top passages",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "route",
      "source": "gateway",
      "target": "model",
      "label": "Model call",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "record",
      "source": "answer-api",
      "target": "ledger",
      "label": "Answer, citations, trace ID",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "respond",
      "source": "answer-api",
      "target": "workspace",
      "label": "Cited answer or refusal",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "source-change",
      "source": "corpus",
      "target": "ingest",
      "label": "New or changed document",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "index-write",
      "source": "ingest",
      "target": "index",
      "label": "Chunks, embeddings, permission tags",
      "type": "smoothstep",
      "animated": true,
      "data": {
        "kind": "data",
        "dataClass": "confidential"
      }
    },
    {
      "id": "telemetry",
      "source": "gateway",
      "target": "traces",
      "label": "Tokens, latency, cost",
      "type": "smoothstep",
      "animated": false,
      "data": {
        "kind": "telemetry",
        "dataClass": "operational"
      }
    },
    {
      "id": "replay",
      "source": "evals",
      "target": "answer-api",
      "label": "Replay frozen questions per release",
      "type": "smoothstep",
      "animated": false,
      "data": {
        "kind": "control",
        "dataClass": "internal"
      }
    }
  ],
  "viewport": {
    "x": 0,
    "y": 0,
    "zoom": 1
  }
}
