{"ok":true,"data":{"schemaVersion":"browserops.demo_readiness.v1","generatedAt":"2026-07-17T04:01:33.077Z","live":false,"summary":"Demo lanes are declared from the canonical BrowserOps suite registry. Use live=true for bounded public probes.","counts":{"lanes":6,"ready":0,"degraded":0,"failed":0,"declared":6},"runtime":{"browser":{"provider":"browserbase","browserbase":{"status":"configured","configured":true,"projectConfigured":true,"credentialSource":"prefixed","apiUrl":"https://api.browserbase.com"}},"aiGateway":{"schemaVersion":"browserops.ai_gateway_diagnostics.v1","generatedAt":"2026-07-17T04:01:33.078Z","status":"degraded","summary":"AI Gateway is partially configured; BrowserOps can show diagnosis but should not depend on model calls yet.","docs":{"aiGateway":"https://vercel.com/docs/ai-gateway","providersAndModels":"https://ai-sdk.dev/docs/foundations/providers-and-models"},"runtime":{"aiSdk":{"installed":true,"version":"^6.0.229","gatewayCompatible":true},"gatewayPackage":{"installedTransitively":true,"expected":"@ai-sdk/gateway is bundled transitively by ai v6; explicit installation is optional unless BrowserOps needs providerOptions.gateway helpers."},"vercel":{"runningOnVercel":true,"environment":"production","urlConfigured":true}},"auth":{"mode":"vercel_oidc_runtime","oidcTokenPresent":false,"aiGatewayApiKeyPresent":false,"directProviderKeyCount":0,"directProviderKeyNames":[],"message":"The app is running on Vercel; AI Gateway can use Vercel-managed OIDC at runtime if the project has AI Gateway enabled."},"modelPolicy":{"configuredModel":null,"configuredModelSource":null,"providerModelFormat":"missing","message":"No default AI Gateway model is configured. BrowserOps will require callers to provide an explicit provider/model id before making model calls."},"checks":[{"id":"ai-sdk-version","label":"AI SDK gateway compatibility","status":"passed","message":"ai ^6.0.229 is installed and compatible with provider/model gateway routing.","evidence":{"installed":true,"version":"^6.0.229","expectedMajor":6}},{"id":"gateway-auth","label":"Gateway authentication","status":"passed","message":"The app is running on Vercel; AI Gateway can use Vercel-managed OIDC at runtime if the project has AI Gateway enabled.","evidence":{"mode":"vercel_oidc_runtime","oidcTokenPresent":false,"aiGatewayApiKeyPresent":false,"runningOnVercel":true}},{"id":"direct-provider-keys","label":"Direct provider key bypass","status":"passed","message":"No direct provider API keys were detected in the BrowserOps environment.","evidence":{"directProviderKeyCount":0,"directProviderKeyNames":[]}},{"id":"model-format","label":"Provider/model string","status":"warning","message":"No default AI Gateway model is configured. BrowserOps will require callers to provide an explicit provider/model id before making model calls.","evidence":{"configured":false,"source":null}}],"recommendedActions":["Choose a supported provider/model id from the Vercel AI Gateway model catalog before enabling model-backed remediation."],"publicSafeLog":{"schemaVersion":"browserops.log.v1","level":"warn","event":"browserops.ai_gateway.diagnosis","message":"AI Gateway is partially configured; BrowserOps can show diagnosis but should not depend on model calls yet.","service":"browserops","generatedAt":"2026-07-17T04:01:33.078Z","data":{"status":"degraded","aiSdkInstalled":true,"aiVersion":"^6.0.229","gatewayCompatible":true,"authMode":"vercel_oidc_runtime","directProviderKeyCount":0,"modelFormat":"missing"}}}},"workingTools":[{"id":"api-browserops-status","kind":"api","label":"BrowserOps status","method":"GET","href":"/api/browserops/status","publicSafe":true,"status":"working","evidence":"Returns storage, Browserbase, Trace Postgres, event storage, suite, and AI Gateway diagnostics.","demoUse":"Start the demo with the machine-readable BrowserOps backend state."},{"id":"api-demo-readiness","kind":"api","label":"Demo readiness","method":"GET","href":"/api/browserops/demo/readiness","publicSafe":true,"status":"working","evidence":"Returns declared or live readiness lanes for Root, AgentUI, Spec, MCP, Sandbox, and Evals.","demoUse":"Show the suite demo plan without claiming downstream completion."},{"id":"api-suite-registry","kind":"api","label":"Suite registry","method":"GET","href":"/api/browserops/suite","publicSafe":true,"status":"working","evidence":"Returns BrowserOps-owned service relationships, transports, auth boundaries, and handoff examples.","demoUse":"Explain each service identity and BrowserOps relationship."},{"id":"api-journeys","kind":"api","label":"Journey catalog","method":"GET","href":"/api/browserops/journeys","publicSafe":true,"status":"working","evidence":"Returns public-safe generated journey templates from root graph and base sitemap inventory.","demoUse":"Pick a trusted public route for a Browserbase-backed validation."},{"id":"api-runs","kind":"api","label":"Public runs","method":"GET","href":"/api/browserops/runs","publicSafe":true,"status":"working","evidence":"Returns only real public-safe BrowserOps runs from the registry.","demoUse":"Open the stored run evidence instead of synthetic history."},{"id":"api-ai-gateway-diagnostics","kind":"api","label":"AI Gateway diagnosis","method":"GET","href":"/api/browserops/ai-gateway/diagnostics","publicSafe":true,"status":"working","evidence":"Checks AI SDK, OIDC/API-key auth mode, provider-key bypass risk, and provider/model readiness without model calls.","demoUse":"Show whether LLM-assisted social draft workflows are backend-ready."},{"id":"mcp-tools-list","kind":"mcp","label":"MCP tools/list","mcpMethod":"tools/list","publicSafe":true,"status":"working","evidence":"BrowserOps MCP advertises public read tools and protected tools with PLATPHORM_API_KEY boundaries.","demoUse":"Show MCP as the tool registry, not as BrowserOps identity."},{"id":"mcp-get-browserops-status","kind":"mcp","label":"get_browserops_status","mcpMethod":"tools/call","publicSafe":true,"status":"working","evidence":"Calls the real BrowserOps status handler.","demoUse":"Show an agent-readable equivalent of the status API."},{"id":"mcp-list-journeys","kind":"mcp","label":"list_browserops_journeys","mcpMethod":"tools/call","publicSafe":true,"status":"working","evidence":"Calls the real public journey registry.","demoUse":"Let AgentUI or MCP discover candidate browser journeys."},{"id":"mcp-get-suite-registry","kind":"mcp","label":"get_browserops_suite_registry","mcpMethod":"tools/call","publicSafe":true,"status":"working","evidence":"Calls the canonical BrowserOps suite registry.","demoUse":"Show cross-tool identities without flattening each service into BrowserOps."}],"lanes":[{"id":"root","name":"PlatPhorm Root","canonicalUrl":"https://platphormnews.com","role":"Root network graph, public platform manifest, and canonical topology source for the PlatPhormNews mesh.","targetService":"root","traceId":"cb105e6b04ab4f8ae328b0f17b6a8dbc","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"networkGraph","path":"/api/network/graph","url":"https://platphormnews.com/api/network/graph","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"llms","path":"/llms.txt","url":"https://platphormnews.com/llms.txt","required":false,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"Root provides topology; BrowserOps turns public network facts into browser journeys and route evidence.","requestedCapability":"read_network_graph","authorizationState":"public_read","nextAction":"Use root graph and base sitemap as the demo source of truth for discovered journeys."},{"id":"agentui","name":"AgentUI","canonicalUrl":"https://agentui.platphormnews.com","role":"Visual workflow orchestration and tool UI rendering.","targetService":"agentui","traceId":"2eb12ab0cf29129124c0071b8c5e0397","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://agentui.platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"apiDocs","path":"/api/docs","url":"https://agentui.platphormnews.com/api/docs","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"llms","path":"/llms.txt","url":"https://agentui.platphormnews.com/llms.txt","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"handoffReceiver","path":"/api/browserops/receive-handoff","url":"https://agentui.platphormnews.com/api/browserops/receive-handoff","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"AgentUI asks for rendered workflow UI validation; BrowserOps returns screenshot, accessibility, labels, and navigation evidence.","requestedCapability":"validate_rendered_workflow_ui","authorizationState":"server_managed","nextAction":"Open AgentUI lane, preview a journey, and dispatch only after a confirmed receiver response."},{"id":"spec","name":"Spec","canonicalUrl":"https://spec.platphormnews.com","role":"Contract validation, diff, repair, and generation for OpenAPI, AsyncAPI, JSON Schema, MCP, webhook, event, policy, and envelope contracts.","targetService":"spec","traceId":"41a0b996e9672aeb396f36e864cfa6db","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://spec.platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"apiDocs","path":"/api/docs","url":"https://spec.platphormnews.com/api/docs","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"llms","path":"/llms.txt","url":"https://spec.platphormnews.com/llms.txt","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"Spec generates contract-backed journey plans; BrowserOps dry-runs and proves browser behavior for acceptance.","requestedCapability":"dry_run_contract_journey","authorizationState":"public_read","nextAction":"Use Spec contracts to seed journey templates, then run BrowserOps against trusted public targets."},{"id":"mcp","name":"MCP","canonicalUrl":"https://mcp.platphormnews.com","role":"Canonical MCP gateway, tool registry, capability graph, and integration broker.","targetService":"mcp","traceId":"4c55addfe567e3aaa89433f9c597a7dd","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://mcp.platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"mcpManifest","path":"/.well-known/mcp.json","url":"https://mcp.platphormnews.com/.well-known/mcp.json","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"apiDocs","path":"/api/docs","url":"https://mcp.platphormnews.com/api/docs","required":false,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"MCP remains the tool registry; BrowserOps exposes and validates BrowserOps-owned tools through the gateway.","requestedCapability":"discover_browserops_tools","authorizationState":"public_read","nextAction":"Show MCP manifest and BrowserOps MCP tools before launching any protected browser run."},{"id":"sandbox","name":"Sandbox","canonicalUrl":"https://sandbox.platphormnews.com","role":"Bounded command execution, file writing, logs, artifacts, and public-safe reports.","targetService":"sandbox","traceId":"7716f85b968e5245e2f40230ba0cd29c","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://sandbox.platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"apiDocs","path":"/api/docs","url":"https://sandbox.platphormnews.com/api/docs","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"llms","path":"/llms.txt","url":"https://sandbox.platphormnews.com/llms.txt","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"handoffReceiver","path":"/api/sandbox/receive-handoff","url":"https://sandbox.platphormnews.com/api/sandbox/receive-handoff","required":false,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"Sandbox produces bounded previews; BrowserOps validates the resulting public page in a real browser.","requestedCapability":"validate_public_preview_url","authorizationState":"server_managed","nextAction":"Send a Sandbox preview URL to BrowserOps and capture public-safe artifacts."},{"id":"evals","name":"Evals","canonicalUrl":"https://evals.platphormnews.com","role":"Evidence-backed QA, scorecards, release gates, suites, and decisions.","targetService":"evals","traceId":"41c3ebcc8140eabcf19e673da8030e48","status":"declared","probes":[{"name":"health","path":"/api/health","url":"https://evals.platphormnews.com/api/health","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"apiDocs","path":"/api/docs","url":"https://evals.platphormnews.com/api/docs","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"llms","path":"/llms.txt","url":"https://evals.platphormnews.com/llms.txt","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."},{"name":"handoffReceiver","path":"/api/evals/receive-handoff","url":"https://evals.platphormnews.com/api/evals/receive-handoff","required":true,"fetched":false,"status":"declared","httpStatus":null,"durationMs":0,"traceAccepted":false,"message":"Declared demo dependency. Add live=true to fetch this route."}],"browserOpsContract":"Evals remains the release gate; BrowserOps supplies run summaries and artifacts for evidence-backed scorecards.","requestedCapability":"submit_browser_run_evidence","authorizationState":"server_managed","nextAction":"Submit a real BrowserOps run to Evals and keep the lane degraded if completed artifacts are missing."}],"workflows":[{"id":"spec-browserops-evals","label":"Spec to BrowserOps to Evals","from":"spec","to":"evals","capability":"contract_journey_to_release_gate_evidence","status":"preview_ready","explanation":"Spec creates the plan, BrowserOps proves browser behavior, and Evals scores only confirmed evidence.","nextAction":"Preview a Spec journey, run BrowserOps on a trusted target, then send the real run to Evals."},{"id":"agentui-browserops","label":"AgentUI to BrowserOps","from":"agentui","to":"browserops","capability":"validate_rendered_workflow_ui","status":"preview_ready","explanation":"AgentUI remains the workflow UI; BrowserOps returns browser-visible proof for labels, navigation, accessibility, and screenshots.","nextAction":"Launch an AgentUI workflow validation and open the BrowserOps run detail."},{"id":"sandbox-browserops","label":"Sandbox to BrowserOps","from":"sandbox","to":"browserops","capability":"validate_public_preview_url","status":"planned","explanation":"Sandbox builds or replays; BrowserOps validates the public preview in a real browser.","nextAction":"Send a Sandbox preview URL and keep artifacts public-safe unless explicitly protected."},{"id":"mcp-browserops","label":"MCP to BrowserOps","from":"mcp","to":"browserops","capability":"discover_and_call_browserops_tools","status":"planned","explanation":"MCP remains the tool registry; BrowserOps exposes browser evidence tools with protected execution boundaries.","nextAction":"Show MCP manifest and public BrowserOps tools before any protected tool call."},{"id":"sheets-docs-linkedin-browserops","label":"Sheets to Docs social draft to LinkedIn","from":"sheets","to":"docs","capability":"validate_social_draft_publish_workflow","status":"scenario_ready","explanation":"Sheets supplies topics, AI Gateway drafts copy, Docs owns draft/SEO/share workflow, and BrowserOps validates the browser-visible evidence surfaces.","nextAction":"Demo as a scenario until Sheets read, Docs draft save, Docs SEO share, and LinkedIn confirmation endpoints are wired and confirmed."}],"scenarios":[{"id":"sheets-docs-linkedin","label":"Twice-daily topic to Docs draft to LinkedIn","status":"scenario_ready","sourceUrl":"https://sheets.platphormnews.com/sheets/sheet_1780370317152_c1qnagy","cadence":"Twice daily when a real scheduler exists and returns confirmation.","explanation":"A demo-ready scenario: read a random topic from Sheets, use Vercel AI Gateway for draft copy, save the social draft in Docs, run Docs SEO/share checks, and publish to LinkedIn only after Docs/LinkedIn confirms the action.","evidenceBoundary":"BrowserOps can validate browser pages, API docs, health, draft UI, SEO UI, and evidence reports. It must not claim the LinkedIn post was scheduled or published until Docs and LinkedIn return confirmed evidence.","steps":[{"actor":"Sheets","requestedCapability":"read_random_topic_row","status":"needs_confirmation","nextAction":"Confirm Sheets exposes a public-safe read or protected service endpoint for the sheet topic source."},{"actor":"Vercel AI Gateway","requestedCapability":"draft_social_media_post","status":"needs_confirmation","nextAction":"Configure provider/model and gateway auth before any model-backed generation is claimed."},{"actor":"Docs","requestedCapability":"save_social_draft_and_run_seo_checks","status":"needs_confirmation","nextAction":"Confirm Docs draft and SEO endpoints, then store the draft URL as evidence."},{"actor":"LinkedIn via Docs","requestedCapability":"publish_or_schedule_post","status":"not_browserops","nextAction":"Docs or a dedicated publisher must confirm LinkedIn delivery; BrowserOps only verifies browser-visible evidence."},{"actor":"BrowserOps","requestedCapability":"validate_pages_and_capture_evidence","status":"working_surface","nextAction":"Run browser checks on Sheets, Docs draft/SEO, and public-safe confirmation pages."}]}]},"meta":{"generatedAt":"2026-07-17T04:01:33.079Z","traceId":"browserops-public-read","degraded":false,"source":"generated"},"warnings":[],"errors":[]}