{"generatedAt":"2026-07-25T18:34:09.105Z","liveReadyCount":2,"credentialBlockedCount":4,"manualImportCount":0,"items":[{"id":"trovii-owner-session-auth","kind":"auth","label":"Trovii owner/session auth for buyer queues","route":"lib/auth/session.ts + lib/auth/ownerGuard.ts + /api/auth/session","routeExists":true,"requiredEnv":["SESSION_SECRET","OWNER_QUEUE_KEYS"],"whatWorksNow":"The repo can mint signed Trovii sessions, prefer session identity over spoofable body actor ids, and guard owner/operator queues with signed owner sessions or scoped owner keys.","whatBlocksLive":"SESSION_SECRET and OWNER_QUEUE_KEYS must be set in the deployed runtime. Production owner queues fail closed when OWNER_QUEUE_KEYS is missing.","setupSteps":["Set SESSION_SECRET in the deployed Trovii runtime so signed sessions can be minted and verified.","Set OWNER_QUEUE_KEYS with scoped keys such as montreux:<secret>,gallery:<secret>,sponsor:<secret> for operator queues.","Verify /api/auth/session returns a signed httpOnly session cookie for an owner and that owner queues reject unsigned callers.","Use owner sessions or scoped keys for buyer/admin demos; never rely on body-supplied actor ids for write identity."],"buyerOutcome":"A gallery, sponsor, festival, or hotel can safely open their queue without another buyer seeing or changing it.","evidenceBoundary":"Without deployed session and owner-key env, owner surfaces are local/demo-only and must not be treated as production-secure buyer workspaces.","status":"live-ready","presentEnv":["SESSION_SECRET","OWNER_QUEUE_KEYS"],"missingEnv":[]},{"id":"supabase-money-passport-persistence","kind":"supabase","label":"Supabase persistence for money, read-back, and passport","route":"lib/supabaseAdmin.ts + commerce/passport stores","routeExists":true,"requiredEnv":["NEXT_PUBLIC_SUPABASE_URL","SUPABASE_SERVICE_ROLE_KEY"],"whatWorksNow":"The repo has Supabase-backed store paths for money/read-back/passport data, and the linked Supabase project has the core persistence tables for commerce ledger, Stripe webhook audits, and unified passports.","whatBlocksLive":"The deployed runtime must have NEXT_PUBLIC_SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY set. Without them, server stores fall back to local JSON where implemented, which is not production persistence.","setupSteps":["Set NEXT_PUBLIC_SUPABASE_URL to the linked Supabase project URL in the deployed Trovii runtime.","Set SUPABASE_SERVICE_ROLE_KEY only in server-side/deployment secrets; never expose it to client code.","Verify money-bearing writes land in commerce_ledger_entries and Stripe webhook audits land in stripe_webhook_events.","Verify cross-app passport writes land in unified_passports, passport_identity_keys, and passport_entry_history."],"buyerOutcome":"Money proof, read-back, and passport traces persist across deploys instead of living in local JSON files.","evidenceBoundary":"If Supabase env is absent, the app may still work locally, but buyer proof must not be treated as durable production data.","status":"live-ready","presentEnv":["NEXT_PUBLIC_SUPABASE_URL","SUPABASE_SERVICE_ROLE_KEY"],"missingEnv":[]},{"id":"stripe-connect-checkout","kind":"stripe","label":"Stripe Connect checkout and attribution read-back","route":"/api/basel/stripe/direct-checkout + /api/basel/stripe/webhook","routeExists":true,"requiredEnv":["STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET"],"whatWorksNow":"The code can create merchant-owned Stripe Checkout sessions, verify signed webhooks, confirm routed purchases, and record manual or transferred router payout state.","whatBlocksLive":"Real Stripe secret key, webhook secret, connected-account onboarding, and a deployed webhook endpoint must be configured before it is production live.","setupSteps":["Create or select the Stripe Connect platform account and one real connected account for the pilot merchant/gallery.","Set STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET in the deployed Trovii environment.","Register the deployed /api/basel/stripe/webhook URL in Stripe and subscribe to checkout.session.completed plus transfer/payment events used by the routed ledger.","Run one low-value live checkout and confirm the routed purchase appears in the revenue-proof surface with source labeled live-confirmed."],"buyerOutcome":"A scan or routed purchase can become confirmed revenue, ROI proof, and payout intent instead of a self-reported claim.","evidenceBoundary":"Without signed Stripe webhook confirmation, money proof must be labeled manual/imported rather than live-confirmed.","status":"code-ready-needs-credentials","presentEnv":[],"missingEnv":["STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET"]},{"id":"generic-readback-webhook","kind":"readback","label":"Generic live read-back webhook","route":"/api/read-back/ingest?vendor=generic","routeExists":true,"requiredEnv":["READBACK_WEBHOOK_SECRET"],"whatWorksNow":"The route parses vendor payloads, rate-limits requests, records real outcome rows, and supports a local unauthenticated dev mode that is flagged honestly.","whatBlocksLive":"Set READBACK_WEBHOOK_SECRET and configure the vendor or middleware to send the agreed join key and outcome fields.","setupSteps":["Set READBACK_WEBHOOK_SECRET in the deployed environment.","Give the partner the /api/read-back/ingest?vendor=generic endpoint and required x-readback-secret header.","Agree the join key fields: targetId, actorId or externalRef, outcome status, amount, currency, occurredAt.","Send one test payload and verify it records a world-outcome row labeled live read-back."],"buyerOutcome":"Hotels, merchants, events, and partners can send confirmed bookings, purchases, reservations, or attendance back into the proof ledger.","evidenceBoundary":"If the secret is missing, accepted local reads are not production-authenticated and must not be sold as verified live read-back.","status":"code-ready-needs-credentials","presentEnv":[],"missingEnv":["READBACK_WEBHOOK_SECRET"]},{"id":"pms-opera-mews","kind":"pms","label":"Hotel PMS read-back","route":"/api/read-back/ingest?vendor=pms","routeExists":true,"requiredEnv":["READBACK_WEBHOOK_SECRET"],"whatWorksNow":"The adapter can model reservation-confirmed or checked-out events from PMS-style webhook/export rows and join them to captured hotel demand.","whatBlocksLive":"Opera, Mews, booking-engine, or integration middleware credentials and final field mapping are still external setup work.","setupSteps":["Choose the pilot PMS/export source, likely Mews, Opera, booking-engine CSV, or integration middleware.","Map reservation id, guest/contact id, stay dates, booking channel, amount, currency, status, and Trovii target/join key.","Route the mapped payload to /api/read-back/ingest?vendor=pms with READBACK_WEBHOOK_SECRET.","Verify one recovered booking joins back to a hotel demand signal before showing PMS-confirmed revenue."],"buyerOutcome":"A boutique hotel can prove which cultural-week signals became bookings, partner routes, or return intent.","evidenceBoundary":"Until PMS field maps and credentials are connected, hotel proof is manual import or modeled intent, not live PMS-confirmed revenue.","status":"code-ready-needs-credentials","presentEnv":[],"missingEnv":["READBACK_WEBHOOK_SECRET"]},{"id":"pos-toast-square","kind":"pos","label":"Restaurant/merchant POS read-back","route":"/api/read-back/ingest?vendor=pos","routeExists":true,"requiredEnv":["READBACK_WEBHOOK_SECRET"],"whatWorksNow":"The adapter can accept POS/order-like rows and record converted outcomes against captured demand or target ids.","whatBlocksLive":"Toast, Square, Shopify POS, or middleware webhook credentials and final join-key agreement are still external setup work.","setupSteps":["Choose the pilot POS/export source and the merchant join key strategy.","Map order id, target/product/place id, amount, currency, status, occurredAt, and optional referral/source id.","Route the mapped payload to /api/read-back/ingest?vendor=pos with READBACK_WEBHOOK_SECRET.","Verify one save/route/offer converts into a POS-confirmed outcome before showing merchant conversion proof."],"buyerOutcome":"A merchant can prove that a save, route, or regret signal became a reservation, order, restock, or purchase.","evidenceBoundary":"Without POS webhook/export confirmation, the system can show demand and intent but not verified POS conversion.","status":"code-ready-needs-credentials","presentEnv":[],"missingEnv":["READBACK_WEBHOOK_SECRET"]},{"id":"shopify-commerce","kind":"shopify","label":"Shopify commerce read-back","routeExists":false,"requiredEnv":["SHOPIFY_ADMIN_ACCESS_TOKEN","SHOPIFY_WEBHOOK_SECRET"],"whatWorksNow":"Commerce attribution and payout semantics exist, and Shopify orders can still be imported manually through generic outcome/read-back paths.","whatBlocksLive":"A dedicated Shopify webhook/app install, product/order field map, and verification secret are not wired in this app yet.","setupSteps":["Decide whether Shopify should use the generic read-back ingest first or a dedicated Shopify webhook route.","Map order id, line items, product ids, discount/referral source, amount, currency, customer consent fields, and fulfilled/paid status.","Install or configure Shopify webhook credentials and verification secret.","Add a dedicated route or adapter only after the pilot merchant needs more than generic order import."],"buyerOutcome":"A fashion, music, athlete, or merchant world can attribute saved objects and fan demand to orders once connected.","evidenceBoundary":"Until a Shopify webhook or export is connected, order attribution must be labeled imported/manual.","status":"not-wired","presentEnv":[],"missingEnv":["SHOPIFY_ADMIN_ACCESS_TOKEN","SHOPIFY_WEBHOOK_SECRET"]},{"id":"crm-clienteling","kind":"crm","label":"CRM/clienteling read-back","routeExists":false,"requiredEnv":["CRM_WEBHOOK_SECRET"],"whatWorksNow":"Sponsor proof produces consent-aware clienteling queues and relationship yield, but CRM task completion is not live-confirmed.","whatBlocksLive":"Salesforce, HubSpot, Attio, concierge CRM, or clienteling tool webhook credentials and field maps are not wired yet.","setupSteps":["Pick the first CRM/clienteling destination for sponsor or gallery follow-up.","Map contact id, consent state, task owner, meeting/viewing/opportunity status, value if known, and Trovii intro/follow-up id.","Add a CRM adapter or route through /api/read-back/ingest?vendor=generic with CRM_WEBHOOK_SECRET/READBACK_WEBHOOK_SECRET policy.","Verify one clienteling task moves from queued to contacted/met/won before calling the report CRM-confirmed."],"buyerOutcome":"A sponsor or gallery can prove which opt-in follow-up became a meeting, viewing, opportunity, or clienteling task.","evidenceBoundary":"Follow-up queues are actionable, but not CRM-confirmed unless a CRM import or webhook read-back exists.","status":"not-wired","presentEnv":[],"missingEnv":["CRM_WEBHOOK_SECRET"]},{"id":"ticketing-attendance","kind":"ticketing","label":"Ticketing and attendance read-back","routeExists":false,"requiredEnv":["TICKETING_WEBHOOK_SECRET"],"whatWorksNow":"Festival and remote afterlife worlds can capture saves, follows, archive demand, and route intent; attendance can be manually imported.","whatBlocksLive":"Ticketing provider credentials, webhook verification, and attendee join-key policy are not wired yet.","setupSteps":["Pick the first ticketing/waitlist source for the festival pilot.","Map ticket id, attendee consent key, event/set id, status, amount, currency, and waitlist/sold-out state.","Decide whether attendance is imported batch-first or live webhook-first.","Verify one remote/onsite save joins to ticket purchase, attendance, waitlist, or membership demand before claiming ticketing proof."],"buyerOutcome":"A festival can prove which remote or onsite actions became ticket purchase, attendance, return intent, or membership demand.","evidenceBoundary":"Without ticketing read-back, event proof is memory/intent/archive demand rather than verified attendance or ticket conversion.","status":"not-wired","presentEnv":[],"missingEnv":["TICKETING_WEBHOOK_SECRET"]}],"plainEnglish":"2 integration paths are live-ready in this environment; 4 code-ready paths need credentials or webhook setup. Routes that are not wired can still use manual import/read-back, but must be labeled as imported rather than live-confirmed."}