{
  "schemaVersion": 1,
  "generatedAt": "2026-07-18T13:47:03.091Z",
  "status": "SUPPORT_OPS_WAITING_ON_HANDOFFS",
  "label": "Support Ops Waiting On Handoffs",
  "supportEmail": "support@support.porterlabz.com",
  "supportInboxConfirmed": "Yes",
  "dashboardFields": [
    "decisions.supportEmail",
    "decisions.domain",
    "billingRehearsal.supportInboxConfirmed",
    "billingRehearsal.customerPortalConfigured",
    "billingRehearsal.attorneyReviewStatus",
    "billingRehearsal.backendBaseUrl",
    "billingRehearsal.webhookEndpointUrl",
    "visualProduction.finalScreenshotsApproved"
  ],
  "uploadSlots": [
    "support-roundtrip",
    "domain-email",
    "legal-review",
    "stripe-screenshots",
    "product-screenshots",
    "qa-evidence"
  ],
  "actions": [
    {
      "id": "support-email-saved",
      "source": "support-ops-pack",
      "phase": "1. Public Support Identity",
      "priority": "P0",
      "owner": "User",
      "status": "Ready",
      "label": "Support email saved",
      "detail": "support@support.porterlabz.com",
      "action": "Save the support address customers will see in the app, Stripe receipts, public policies, and launch site.",
      "evidenceNeeded": "Save decisions.supportEmail in the dashboard and upload sanitized support evidence to domain-email.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "decisions.supportEmail",
      "uploadSlot": "domain-email",
      "verificationCommand": "npm run support:ops-pack && npm run test:support-ops-pack",
      "noGoRule": "No paid checkout without a public support contact."
    },
    {
      "id": "support-inbox-roundtrip",
      "source": "support-ops-pack",
      "phase": "1. Public Support Identity",
      "priority": "P0",
      "owner": "User",
      "status": "Ready",
      "label": "Support inbox ticket roundtrip confirmed",
      "detail": "supportInboxConfirmed=Yes",
      "action": "Send a test customer email to the support inbox, reply from the inbox, and upload sanitized proof of the roundtrip.",
      "evidenceNeeded": "Save billingRehearsal.supportInboxConfirmed in the dashboard and upload sanitized support evidence to support-roundtrip.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "billingRehearsal.supportInboxConfirmed",
      "uploadSlot": "support-roundtrip",
      "verificationCommand": "npm run support:ops-pack && npm run test:support-ops-pack",
      "noGoRule": "No paid beta until a real support inbox can receive and answer a customer ticket."
    },
    {
      "id": "public-domain-support-path",
      "source": "support-ops-pack",
      "phase": "2. Public Policy And Domain",
      "priority": "P0",
      "owner": "User",
      "status": "Ready",
      "label": "Public domain and policy support path saved",
      "detail": "porterlabz.com",
      "action": "Save the public product domain so privacy, terms, refund, cancellation, support, checkout success, and portal return URLs can match.",
      "evidenceNeeded": "Save decisions.domain in the dashboard and upload sanitized support evidence to domain-email.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "decisions.domain",
      "uploadSlot": "domain-email",
      "verificationCommand": "npm run public:launch-config && npm run test:public-launch-config",
      "noGoRule": "No public checkout unless policy/support URLs are on the intended public domain."
    },
    {
      "id": "diagnostics-export",
      "source": "support-ops-pack",
      "phase": "3. Customer Diagnostics",
      "priority": "P0",
      "owner": "Codex",
      "status": "Ready",
      "label": "Redacted support diagnostics export exists",
      "detail": "Settings diagnostics UI and Electron redaction handler exist.",
      "action": "Keep Settings diagnostics export available and redacted before every release candidate.",
      "evidenceNeeded": "Save supportOps.diagnosticsStatus in the dashboard and upload sanitized support evidence to qa-evidence.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "supportOps.diagnosticsStatus",
      "uploadSlot": "qa-evidence",
      "verificationCommand": "npm run test:support-readiness && npm run test:support-diagnostics-runtime",
      "noGoRule": "Support must not ask customers for raw chats, API keys, tokens, full card numbers, screenshots with secrets, or private files."
    },
    {
      "id": "support-runbook",
      "source": "support-ops-pack",
      "phase": "4. Support Process",
      "priority": "P0",
      "owner": "Codex",
      "status": "Ready",
      "label": "Support runbook and inbox setup docs exist",
      "detail": "runbook=true; inboxSetup=true",
      "action": "Keep support categories, evidence rules, response targets, canned replies, and inbox setup docs current with the shipping product.",
      "evidenceNeeded": "Save supportOps.runbookStatus in the dashboard and upload sanitized support evidence to qa-evidence.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "supportOps.runbookStatus",
      "uploadSlot": "qa-evidence",
      "verificationCommand": "npm run test:support-readiness",
      "noGoRule": "No paid beta without a written support process for install, activation, billing, cancellation, privacy, and computer-control tickets."
    },
    {
      "id": "billing-cancellation-support",
      "source": "support-ops-pack",
      "phase": "5. Billing Support",
      "priority": "P0",
      "owner": "User + Codex",
      "status": "Ready",
      "label": "Customer Portal cancellation and invoice support configured",
      "detail": "customerPortalConfigured=Yes",
      "action": "Configure Stripe Customer Portal for cancellation, invoice history, and payment method updates; then test the support reply path.",
      "evidenceNeeded": "Save billingRehearsal.customerPortalConfigured in the dashboard and upload sanitized support evidence to stripe-screenshots.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "billingRehearsal.customerPortalConfigured",
      "uploadSlot": "stripe-screenshots",
      "verificationCommand": "npm run payment:launch-pack && npm run test:payment-launch-pack",
      "noGoRule": "Do not take recurring subscription money without a customer cancellation path."
    },
    {
      "id": "hosted-billing-support-links",
      "source": "support-ops-pack",
      "phase": "5. Billing Support",
      "priority": "P0",
      "owner": "User + Codex",
      "status": "Ready",
      "label": "Hosted billing support links saved",
      "detail": "backend=https://billing.porterlabz.com; webhook=https://billing.porterlabz.com/api/billing/webhook",
      "action": "Save hosted billing backend and Stripe webhook URLs so support can distinguish checkout, portal, webhook, and activation failures.",
      "evidenceNeeded": "Save billingRehearsal.backendBaseUrl in the dashboard and upload sanitized support evidence to cloud-handoff.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "billingRehearsal.backendBaseUrl",
      "uploadSlot": "cloud-handoff",
      "verificationCommand": "npm run billing:live-preflight -- --mode test --allow-blocked",
      "noGoRule": "Support cannot debug real customer billing until hosted backend and webhook URLs are known."
    },
    {
      "id": "legal-support-review",
      "source": "support-ops-pack",
      "phase": "6. Legal And Policy Review",
      "priority": "P0",
      "owner": "User",
      "status": "Waiting on handoff",
      "label": "Support, refund, privacy, and cancellation language reviewed",
      "detail": "attorneyReviewStatus=Not approved",
      "action": "Review final-sale, cancellation, support, privacy, and paid-beta language with an attorney/accountant or explicitly mark approved after review.",
      "evidenceNeeded": "Save billingRehearsal.attorneyReviewStatus in the dashboard and upload sanitized support evidence to legal-review.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "billingRehearsal.attorneyReviewStatus",
      "uploadSlot": "legal-review",
      "verificationCommand": "npm run test:policy-readiness",
      "noGoRule": "Do not launch paid beta while support/refund/cancellation language is unreviewed."
    },
    {
      "id": "support-visuals-current",
      "source": "support-ops-pack",
      "phase": "7. Support Visual Evidence",
      "priority": "P0",
      "owner": "Codex",
      "status": "Waiting on product freeze",
      "label": "Support screenshots match shipping app",
      "detail": "finalScreenshotsApproved=No",
      "action": "Refresh support, diagnostics, billing, cancellation, and activation screenshots after the shipping UI and support paths are frozen.",
      "evidenceNeeded": "Save visualProduction.finalScreenshotsApproved in the dashboard and upload sanitized support evidence to product-screenshots.",
      "dashboardPage": "pages/support.html",
      "dashboardField": "visualProduction.finalScreenshotsApproved",
      "uploadSlot": "product-screenshots",
      "verificationCommand": "npm run visuals:pack && npm run test:visual-production-pack",
      "noGoRule": "Do not use support visuals that show stale UI, wrong support email, wrong policy URLs, or incomplete billing flow."
    }
  ],
  "supportCommands": [
    {
      "id": "refresh-support-pack",
      "phase": "0. Dashboard Sync",
      "owner": "Codex",
      "command": "npm run support:ops-pack && npm run test:support-ops-pack",
      "purpose": "Refresh support handoffs, support macros, dashboard state, and support no-go rules.",
      "noGoRule": "Do not rely on stale support status before enabling paid checkout."
    },
    {
      "id": "support-readiness",
      "phase": "3. Customer Diagnostics",
      "owner": "Codex",
      "command": "npm run test:support-readiness",
      "purpose": "Verify redacted diagnostics, Settings support UI, support runbook, and dashboard Support page wiring.",
      "noGoRule": "Support diagnostics must never export raw chats, tokens, license blobs, API keys, passwords, screenshots, or transcripts."
    },
    {
      "id": "support-diagnostics-runtime",
      "phase": "3. Customer Diagnostics",
      "owner": "Codex",
      "command": "npm run test:support-diagnostics-runtime",
      "purpose": "Runtime-smoke the diagnostics export and redaction rules.",
      "noGoRule": "Do not ask customers to send unredacted private data."
    },
    {
      "id": "public-support-config",
      "phase": "2. Public Policy And Domain",
      "owner": "Codex",
      "command": "npm run public:launch-config && npm run test:public-launch-config",
      "purpose": "Verify public domain, support email, policy URLs, billing redirects, and launch-site support links.",
      "noGoRule": "No public checkout until the support path in app, policies, Stripe, and launch site agree."
    },
    {
      "id": "payment-support-gate",
      "phase": "5. Billing Support",
      "owner": "User + Codex",
      "command": "npm run payment:launch-pack && npm run billing:live-preflight -- --mode test --allow-blocked",
      "purpose": "Keep billing support, Customer Portal, webhook, backend URL, support inbox, and legal review blockers visible.",
      "noGoRule": "Recurring billing must stay blocked until cancellation, invoices, support, and refund workflow can be handled."
    }
  ],
  "supportEvidenceChecklist": [
    {
      "id": "customer-ticket-received",
      "phase": "Support roundtrip",
      "required": true,
      "uploadSlot": "support-roundtrip",
      "evidence": "Sanitized screenshot or export showing a test customer email arrived in the support inbox.",
      "redactionRule": "Hide inbox passwords, recovery details, unrelated mailbox content, full customer addresses, and message bodies that contain private data.",
      "clears": "billingRehearsal.supportInboxConfirmed can only move to Yes after receive and reply evidence both exist."
    },
    {
      "id": "support-reply-sent",
      "phase": "Support roundtrip",
      "required": true,
      "uploadSlot": "support-roundtrip",
      "evidence": "Sanitized proof that the support inbox sent a reply to the test customer ticket.",
      "redactionRule": "Show only the support address, timestamp, subject, and a non-sensitive reply excerpt.",
      "clears": "Proves the support inbox can answer a real customer ticket."
    },
    {
      "id": "diagnostics-redaction-proof",
      "phase": "Diagnostics",
      "required": true,
      "uploadSlot": "qa-evidence",
      "evidence": "Runtime smoke output or reviewed sample proving diagnostics redact tokens, license blobs, emails, transcripts, raw chats, and private files.",
      "redactionRule": "Do not upload real customer diagnostics unless the customer reviewed the file first.",
      "clears": "Keeps diagnostics export ready without requesting raw secrets from customers."
    },
    {
      "id": "customer-portal-proof",
      "phase": "Billing support",
      "required": true,
      "uploadSlot": "stripe-screenshots",
      "evidence": "Sanitized Customer Portal test showing cancellation, invoice history, and payment-method update paths.",
      "redactionRule": "Hide Stripe secret keys, webhook secrets, customer IDs when not needed, full card data, and account recovery details.",
      "clears": "billingRehearsal.customerPortalConfigured can only move to Yes after the portal support path is tested."
    },
    {
      "id": "billing-link-proof",
      "phase": "Billing support",
      "required": true,
      "uploadSlot": "cloud-handoff",
      "evidence": "Hosted billing backend base URL and Stripe webhook endpoint saved as HTTPS URLs, with health/preflight output if available.",
      "redactionRule": "URLs are allowed; raw Stripe keys, webhook secrets, bearer tokens, and license signing secrets are not.",
      "clears": "Lets support separate checkout, portal, webhook, entitlement, and activation failures."
    },
    {
      "id": "billing-escalation-proof",
      "phase": "Billing support",
      "required": true,
      "uploadSlot": "stripe-screenshots",
      "evidence": "Sanitized billing escalation notes showing how support distinguishes checkout failure, portal failure, duplicate charge, refund request, webhook delay, and activation failure.",
      "redactionRule": "Use ticket IDs, timestamps, and non-sensitive status only. Hide payment method details, Stripe secrets, customer IDs when not needed, and private account recovery details.",
      "clears": "Proves billing support can route customer money issues without exposing payment secrets or guessing from incomplete evidence."
    },
    {
      "id": "policy-review-proof",
      "phase": "Legal and policy",
      "required": true,
      "uploadSlot": "legal-review",
      "evidence": "Attorney/accountant review status or sanitized note covering support, refund, cancellation, privacy, tax, and paid-beta language.",
      "redactionRule": "Do not store private legal account credentials, tax IDs, recovery codes, or personal address details in generated docs.",
      "clears": "Paid beta support language can only be marked approved after real review evidence exists."
    }
  ],
  "supportFlowEvidenceGate": {
    "status": "SUPPORT_ROUNDTRIP_EVIDENCE_READY",
    "label": "Support Roundtrip Evidence Ready",
    "supportInboxConfirmed": "Yes",
    "requiredProof": [
      "customer-ticket-received",
      "support-reply-sent",
      "diagnostics-redaction-proof",
      "customer-portal-proof",
      "billing-link-proof",
      "billing-escalation-proof",
      "policy-review-proof"
    ],
    "noGoRule": "Do not mark support inbox roundtrip, billing support, or paid-beta support readiness complete until receive proof, reply proof, and billing support evidence are uploaded as sanitized artifacts.",
    "nextAction": "Review uploaded support-roundtrip proof before changing paid-beta readiness."
  },
  "supportEscalationMatrix": [
    {
      "id": "billing-charge-refund",
      "category": "Billing charge, duplicate charge, or refund request",
      "severity": "P0 money",
      "owner": "Support + Billing",
      "firstResponseTarget": "Same business day before paid beta; 4 business hours after paid beta opens.",
      "requiredEvidence": "Checkout email, charge date, non-sensitive Stripe event or ticket ID, and redacted diagnostics when activation is involved.",
      "redactionRule": "Never request or store full card numbers, Stripe secret keys, webhook secrets, bank details, passwords, or recovery codes.",
      "noGoRule": "Escalate before promising a refund when policy review, charge ownership, or Stripe evidence is incomplete."
    },
    {
      "id": "activation-after-checkout",
      "category": "Paid activation failed after checkout",
      "severity": "P0 entitlement",
      "owner": "Support + License Activation",
      "firstResponseTarget": "Same business day before paid beta; 4 business hours after paid beta opens.",
      "requiredEvidence": "Checkout email, app version, exact activation error, return-to-app result, and redacted support diagnostics.",
      "redactionRule": "Do not ask for license signing secrets, raw license blobs, API keys, full transcripts, or private files.",
      "noGoRule": "Do not mark paid support ready until support can distinguish checkout, webhook, entitlement, portal, and device activation failures."
    },
    {
      "id": "portal-cancellation-invoice",
      "category": "Customer Portal, cancellation, invoices, or payment methods",
      "severity": "P0 subscription",
      "owner": "Support + Billing",
      "firstResponseTarget": "Same business day before paid beta; 4 business hours after paid beta opens.",
      "requiredEvidence": "Sanitized Customer Portal proof, portal link source, checkout email, approximate purchase time, and user-visible error text.",
      "redactionRule": "Hide customer IDs when not needed, payment method details, Stripe account recovery data, and unrelated inbox content.",
      "noGoRule": "Recurring billing remains blocked until cancellation, invoice history, and payment-method update paths are tested."
    },
    {
      "id": "diagnostics-privacy-security",
      "category": "Diagnostics, privacy, security, or data request",
      "severity": "P1 privacy",
      "owner": "Support + Privacy/Legal",
      "firstResponseTarget": "One business day before paid beta; same business day for security or data exposure reports.",
      "requiredEvidence": "Redacted diagnostic bundle, customer-reviewed notes, policy URL involved, and sanitized reproduction details.",
      "redactionRule": "Do not collect raw chats, screenshots with secrets, private documents, passwords, recovery codes, or unreviewed diagnostics.",
      "noGoRule": "Escalate any suspected secret, payment, account, or private-data exposure before giving operational guidance."
    },
    {
      "id": "computer-control-safety",
      "category": "Computer-control, high-impact action, or safety issue",
      "severity": "P1 safety",
      "owner": "Support + Desktop Runtime",
      "firstResponseTarget": "One business day before paid beta; same business day when a high-impact action is involved.",
      "requiredEvidence": "Exact command, expected result, actual result, approval prompt state, app version, OS version, and redacted diagnostics.",
      "redactionRule": "Do not request private screen recordings, raw transcripts, passwords, or screenshots with sensitive windows visible.",
      "noGoRule": "Escalate high-impact action reports before asking the customer to retry risky actions."
    }
  ],
  "billingSupportTriageRunbook": [
    {
      "id": "checkout-not-created",
      "trigger": "Customer cannot open checkout or checkout fails before payment.",
      "firstCheck": "Verify the hosted billing backend URL, checkout endpoint health, public success/cancel URLs, and support email shown to the customer.",
      "evidence": "Support ticket ID, app version, public billing origin, sanitized error text, and billing preflight output when available.",
      "replyMacro": "Billing Review",
      "escalation": "Billing + Cloud",
      "noGoRule": "Do not tell customers to retry payment until backend URL, support email, and checkout configuration are verified."
    },
    {
      "id": "paid-not-activated",
      "trigger": "Checkout completed but NyrA stays locked or shows an activation error.",
      "firstCheck": "Separate return-to-app failure, webhook delay, entitlement lookup, and device activation issues before requesting more customer data.",
      "evidence": "Checkout email, charge time, app version, exact activation error, return-to-app result, and redacted diagnostics.",
      "replyMacro": "Paid Activation After Checkout",
      "escalation": "Support + License Activation",
      "noGoRule": "Do not request raw license blobs, signing secrets, webhook secrets, API keys, or full transcripts."
    },
    {
      "id": "portal-cancel-invoice",
      "trigger": "Customer asks to cancel, view invoices, or update payment method.",
      "firstCheck": "Confirm the Customer Portal link source, return URL, portal configuration status, and invoice/cancellation path before giving policy guidance.",
      "evidence": "Checkout email, approximate purchase time, portal link source, sanitized portal error, and Customer Portal proof if configured.",
      "replyMacro": "Cancellation And Invoice Help",
      "escalation": "Support + Billing",
      "noGoRule": "Recurring billing remains blocked until the portal cancellation and invoice paths are tested with sanitized proof."
    },
    {
      "id": "duplicate-refund-dispute",
      "trigger": "Customer reports duplicate charge, unauthorized charge, refund request, or dispute risk.",
      "firstCheck": "Confirm charge ownership and policy/legal review status before promising a refund, reversal, or account fix.",
      "evidence": "Ticket ID, checkout email, charge date, non-sensitive Stripe event or charge reference, and redacted diagnostics only when activation is involved.",
      "replyMacro": "Billing Review",
      "escalation": "Support + Billing + Legal/Policy",
      "noGoRule": "Never ask for full card numbers, bank details, Stripe secrets, passwords, or recovery codes."
    }
  ],
  "supportIntakeDecisionTree": [
    {
      "id": "money-or-subscription",
      "intakeSignal": "Customer mentions checkout, charge, refund, cancellation, invoice, receipt, subscription, portal, or payment method.",
      "firstQuestion": "Did money move, did checkout fail before payment, or is this only a portal/account-management request?",
      "route": "Billing Support Triage Runbook",
      "requiredEvidence": "Checkout email, approximate time, user-visible error text, portal link source when relevant, and non-sensitive Stripe/ticket reference only if already available.",
      "replyMacro": "Billing Review or Cancellation And Invoice Help",
      "noGoRule": "Do not promise refunds, reversals, cancellation completion, or paid-beta readiness until charge ownership, policy status, and portal evidence are verified."
    },
    {
      "id": "paid-activation",
      "intakeSignal": "Customer says payment succeeded but NyrA stayed locked, activation failed, or the app did not return from checkout.",
      "firstQuestion": "Did checkout complete, did the app return to NyrA, and what exact activation error is visible?",
      "route": "Activation After Checkout escalation",
      "requiredEvidence": "Checkout email, app version, exact activation error, return-to-app result, and redacted support diagnostics.",
      "replyMacro": "Paid Activation After Checkout",
      "noGoRule": "Do not request raw license blobs, signing secrets, webhook secrets, API keys, or full transcripts."
    },
    {
      "id": "diagnostics-privacy",
      "intakeSignal": "Customer asks about diagnostics, privacy, data deletion, security, suspicious files, or what NyrA can see.",
      "firstQuestion": "Is there suspected private-data exposure, a security issue, or a routine explanation request?",
      "route": "Diagnostics, privacy, security escalation",
      "requiredEvidence": "Customer-reviewed diagnostic bundle only when needed, policy URL involved, sanitized reproduction details, and no raw chats or private files.",
      "replyMacro": "Diagnostics Request",
      "noGoRule": "Escalate suspected payment, account, secret, or private-data exposure before giving operational guidance."
    },
    {
      "id": "computer-control-safety",
      "intakeSignal": "Customer reports a computer-control command, approval prompt, automation, file action, browser action, or high-impact safety concern.",
      "firstQuestion": "What command was given, what result was expected, what happened, and did a high-impact approval prompt appear?",
      "route": "Computer-control safety escalation",
      "requiredEvidence": "Exact command, expected result, actual result, approval prompt state, app version, OS version, and redacted diagnostics.",
      "replyMacro": "Computer Control",
      "noGoRule": "Do not ask the customer to retry risky actions before support reviews the high-impact approval and diagnostics evidence."
    }
  ],
  "supportRoundtripEvidenceTemplate": {
    "id": "support-roundtrip-proof-template",
    "label": "Support Roundtrip Proof Template",
    "uploadSlot": "support-roundtrip",
    "dashboardField": "billingRehearsal.supportInboxConfirmed",
    "supportEmail": "support@support.porterlabz.com",
    "blockerPreservedWhenMissing": "Keep billingRehearsal.supportInboxConfirmed=No until both receive and reply proof are uploaded and reviewed.",
    "requiredArtifacts": [
      {
        "id": "receive-proof",
        "label": "Receive proof",
        "include": "Support address, received timestamp, test subject, ticket/reference ID if available, and non-sensitive mailbox view showing the ticket arrived.",
        "redact": "Hide inbox passwords, recovery details, unrelated mailbox content, full sender address when not needed, message body private data, and account settings."
      },
      {
        "id": "reply-proof",
        "label": "Reply proof",
        "include": "Support address, sent timestamp, same test subject or ticket/reference ID, and a short non-sensitive reply excerpt.",
        "redact": "Hide unrelated recipients, private customer text, account recovery content, credentials, and any payment details."
      },
      {
        "id": "dashboard-update-proof",
        "label": "Dashboard update proof",
        "include": "After both proofs are reviewed, show billingRehearsal.supportInboxConfirmed set to Yes and the support-roundtrip upload slot populated.",
        "redact": "Do not include raw mailbox credentials, raw bridge tokens, Stripe secrets, API keys, recovery codes, or unreviewed customer diagnostics."
      }
    ],
    "reviewChecklist": [
      "Receive proof and reply proof refer to the same test ticket.",
      "The proof shows the configured support inbox, not a personal inbox alias.",
      "The upload contains no secrets, passwords, private documents, full card numbers, raw tokens, or unrelated customer content.",
      "Only after review should billingRehearsal.supportInboxConfirmed move from No to Yes."
    ],
    "noGoRule": "A support email value or canned reply does not clear the support roundtrip blocker; only sanitized receive and reply evidence clears it."
  },
  "firstResponseQaChecklist": [
    {
      "id": "classify-before-macro",
      "step": "Classify the ticket before choosing a macro.",
      "check": "Match the first customer message to the support intake decision tree and billing support triage route.",
      "passSignal": "One intake route, reply macro, escalation owner, and first-response target are selected.",
      "blockerRule": "Do not send a generic reply when money movement, activation, privacy, security, or high-impact action risk is unclear."
    },
    {
      "id": "redacted-evidence-only",
      "step": "Ask only for redacted evidence.",
      "check": "Compare the draft reply against the route requiredEvidence and redactionRule before sending.",
      "passSignal": "The reply requests no passwords, raw API keys, raw license blobs, full card numbers, private files, raw transcripts, or recovery codes.",
      "blockerRule": "Escalate instead of asking the customer for private data, account recovery details, payment secrets, or unreviewed diagnostics."
    },
    {
      "id": "preserve-missing-proof-blockers",
      "step": "Preserve readiness blockers when proof is missing.",
      "check": "Confirm support roundtrip, Customer Portal, hosted billing links, and policy review evidence exist before claiming readiness or completion.",
      "passSignal": "The reply names what is being reviewed without saying support, billing, cancellation, refund, or paid-beta readiness is complete.",
      "blockerRule": "A canned reply, support email value, plan, or placeholder does not clear supportInboxConfirmed, Customer Portal, billing support, legal review, or paid-beta readiness."
    },
    {
      "id": "route-escalations-before-promises",
      "step": "Route escalation cases before making promises.",
      "check": "For refunds, duplicate charges, activation after checkout, privacy/security, or computer-control safety, confirm the escalation matrix owner and evidence.",
      "passSignal": "The draft avoids promising refunds, reversals, cancellation completion, account fixes, or retries until the owner reviews sanitized evidence.",
      "blockerRule": "Escalate before promising a customer outcome when charge ownership, policy status, portal proof, diagnostics, or high-impact approval evidence is incomplete."
    }
  ],
  "cannedReplies": [
    {
      "id": "diagnostics-request",
      "category": "Diagnostics Request",
      "subject": "NyrA support diagnostics needed",
      "body": "Please open NyrA Settings, choose Export Support Diagnostics, review the JSON file, and attach it in your reply to support@support.porterlabz.com. Do not send passwords, API keys, full card numbers, recovery codes, private documents, or screenshots with secrets visible."
    },
    {
      "id": "activation-help",
      "category": "License Activation",
      "subject": "NyrA license activation help",
      "body": "Please send the checkout email address, app version, Windows version, exact error text, and the redacted support diagnostics file from Settings. Do not send full card numbers, API keys, passwords, or recovery codes."
    },
    {
      "id": "billing-review",
      "category": "Billing Review",
      "subject": "NyrA billing request received",
      "body": "Purchases are final except where required by law or where we confirm a billing error, duplicate charge, unauthorized charge, or license delivery failure caused by our billing system. Please send the checkout email, charge date, and a short description of the issue. Do not send full card numbers."
    },
    {
      "id": "cancellation-portal-help",
      "category": "Cancellation And Invoice Help",
      "subject": "NyrA cancellation or invoice help",
      "body": "Please use the customer portal link from your receipt or NyrA Settings to manage cancellation, invoices, and payment methods. If the portal link fails, send the checkout email, approximate purchase time, app version, and redacted support diagnostics. Do not send card numbers, Stripe secrets, passwords, or recovery codes."
    },
    {
      "id": "activation-after-payment",
      "category": "Paid Activation After Checkout",
      "subject": "NyrA activation after payment",
      "body": "Please confirm whether checkout completed, whether NyrA returned to the app, and the exact activation error text. Attach the redacted support diagnostics file from Settings so we can separate checkout, webhook, portal, entitlement, and device activation failures without asking for private payment details."
    },
    {
      "id": "computer-control-issue",
      "category": "Computer Control",
      "subject": "NyrA computer-control issue",
      "body": "Please describe the exact command you gave NyrA, what happened, what should have happened, and whether the app showed a high-impact approval message. Attach the redacted support diagnostics file from Settings."
    }
  ],
  "counts": {
    "totalActions": 9,
    "userActions": 6,
    "codexActions": 5,
    "waitingActions": 2,
    "readyActions": 7,
    "supportCommands": 5,
    "supportEvidenceItems": 7,
    "supportEscalationItems": 5,
    "billingSupportTriageItems": 4,
    "supportIntakeDecisionItems": 4,
    "firstResponseQaItems": 4,
    "cannedReplies": 6
  },
  "outputs": {
    "json": "docs/launch_command_center/support-ops-pack.json",
    "csv": "docs/launch_command_center/support-ops-pack.csv",
    "report": "docs/launch_command_center/SUPPORT_OPS_PACK.md",
    "dashboard": "docs/launch_command_center/pages/support.html"
  }
}
