{
  "report_schema_version": "0.2",
  "tool_version": "0.2.0",
  "kind": "trace_review",
  "workflow_name": "Manual bank portal not observed",
  "source_type": "synthetic",
  "findings": [
    {
      "finding_id": "F001",
      "code": "UNOBSERVED_ROUTE",
      "category": "evidence_gap",
      "summary": "No execution records are supplied for Manual bank portal.",
      "next_step": "Obtain redacted records or document how this path is governed before concluding coverage.",
      "route_id": "bank-portal"
    }
  ],
  "limitations": [
    "This is a synthetic trace. A reproduced scenario is not evidence of a real customer incident or production protection.",
    "Only supplied records and declared routes are reviewed. Omitted obligations or routes cannot be discovered automatically.",
    "Evidence labels and obligation mapping are supplied by the operator. The lab does not authenticate provider or bank evidence.",
    "No payment is executed, blocked, signed, or authorized by this tool. No production readiness or certification is implied."
  ],
  "input_digest": "0c7a0c8195c9d8622617c47a4eea78ca095d8da56fe1e7788385dff1a7fc5d6a",
  "scope": {
    "routes": [
      {
        "route_id": "processor-a",
        "label": "Original processor",
        "coverage": "captured"
      },
      {
        "route_id": "processor-b",
        "label": "Backup processor",
        "coverage": "captured"
      },
      {
        "route_id": "bank-portal",
        "label": "Manual bank portal",
        "coverage": "unobserved"
      }
    ],
    "obligations": [
      {
        "obligation_id": "invoice-001",
        "amount_minor": 125000,
        "currency": "USD",
        "minor_unit_exponent": 2,
        "payee_ref": "payee-001"
      }
    ],
    "event_count": 4
  },
  "timeline": [
    {
      "event_id": "event-001",
      "at": "2026-01-01T12:00:00Z",
      "type": "decision",
      "detail": "ACCEPT recorded for attempt-a via processor-a.",
      "record": {
        "type": "decision",
        "decision_id": "decision-attempt-a",
        "decision": "ACCEPT",
        "action": {
          "obligation_id": "invoice-001",
          "attempt_id": "attempt-a",
          "route_id": "processor-a",
          "amount_minor": 125000,
          "currency": "USD",
          "payee_ref": "payee-001"
        },
        "event_id": "event-001",
        "at": "2026-01-01T12:00:00Z"
      }
    },
    {
      "event_id": "event-002",
      "at": "2026-01-01T12:00:01Z",
      "type": "release",
      "detail": "Release recorded for attempt-a via processor-a.",
      "record": {
        "type": "release",
        "action": {
          "obligation_id": "invoice-001",
          "attempt_id": "attempt-a",
          "route_id": "processor-a",
          "amount_minor": 125000,
          "currency": "USD",
          "payee_ref": "payee-001"
        },
        "decision_id": "decision-attempt-a",
        "event_id": "event-002",
        "at": "2026-01-01T12:00:01Z"
      }
    },
    {
      "event_id": "event-003",
      "at": "2026-01-01T12:00:02Z",
      "type": "outcome",
      "detail": "unknown recorded for attempt-a.",
      "record": {
        "type": "outcome",
        "attempt_id": "attempt-a",
        "outcome": "unknown",
        "event_id": "event-003",
        "at": "2026-01-01T12:00:02Z"
      }
    },
    {
      "event_id": "event-004",
      "at": "2026-01-01T12:00:03Z",
      "type": "decision",
      "detail": "HOLD recorded for attempt-b via processor-b.",
      "record": {
        "type": "decision",
        "decision_id": "decision-attempt-b",
        "decision": "HOLD",
        "action": {
          "obligation_id": "invoice-001",
          "attempt_id": "attempt-b",
          "route_id": "processor-b",
          "amount_minor": 125000,
          "currency": "USD",
          "payee_ref": "payee-001"
        },
        "event_id": "event-004",
        "at": "2026-01-01T12:00:03Z"
      }
    }
  ],
  "attempt_summary": [
    {
      "attempt_id": "attempt-a",
      "obligation_id": "invoice-001",
      "route_id": "processor-a",
      "replay_status": "unknown"
    }
  ],
  "summary": {
    "verdict": "INCONCLUSIVE",
    "finding_count": 0,
    "evidence_gap_count": 1
  },
  "ci": {
    "mode": "gate",
    "diagnostic_exit_code": 3,
    "process_exit_code": 3
  },
  "owner_summary": {
    "schema_version": "0.1",
    "workflow_name": "Manual bank portal not observed",
    "source_type": "synthetic",
    "result_kind": "trace_review",
    "verdict": "INCONCLUSIVE",
    "finding_count": 0,
    "finding_label": "Recorded findings",
    "evidence_gap_count": 1,
    "scope_statement": "1 mapped obligations, 3 declared paths, 4 supplied events.",
    "declared_routes": [
      {
        "route_id": "processor-a",
        "label": "Original processor",
        "coverage": "captured"
      },
      {
        "route_id": "processor-b",
        "label": "Backup processor",
        "coverage": "captured"
      },
      {
        "route_id": "bank-portal",
        "label": "Manual bank portal",
        "coverage": "unobserved"
      }
    ],
    "decision_requested": "Review the finding and agree the next change with the workflow owner.",
    "next_step": "Obtain redacted records or document how this path is governed before concluding coverage.",
    "priority_finding": {
      "code": "UNOBSERVED_ROUTE",
      "summary": "No execution records are supplied for Manual bank portal.",
      "route_id": "bank-portal"
    },
    "questions_for_owner": [
      "Which actual obligation, original path, and replacement paths are in scope?",
      "Who decides whether to release again, and what evidence supports that decision?",
      "Which paths or records are missing, and when must the next decision be made?"
    ],
    "local_follow_up": {
      "actions": [
        "Retain this result with its declared paths and evidence limits.",
        "Add missing records or reconcile conflicting outcomes; a successful advisory run does not resolve an evidence gap."
      ],
      "purchase_required": false,
      "scope": "Local code checks and supplied-record diagnostics remain useful independently of paid services."
    },
    "workflow_follow_up": {
      "questions": [
        "Do all actual paths, including manual bank portals, use the decision under review?",
        "Who verifies final closure evidence and maps the same obligation across paths?",
        "Who owns the next change, and when must a release decision be made?"
      ],
      "scope": "These questions require evidence from the actual workflow. A synthetic match or incomplete history cannot answer them.",
      "assessment_optional": true
    },
    "limits": [
      "Findings are bounded by the supplied records or synthetic contexts; counts are not monetary losses.",
      "Obligation mapping and final-evidence labels are operator assertions, not authenticated facts.",
      "No payment is executed, blocked, signed, or authorized. Production protection is not established."
    ],
    "assessment": {
      "optional": true,
      "requires": "One actual workflow, an owner, original/backup paths, an agreed evidence scope, and an agreed fee.",
      "deliverables": "A workflow readout, one page of findings and next steps, and supporting records.",
      "progression": "Paid assessment, then shadow evaluation with no payment authority; selective enforcement requires technical validation and customer approval.",
      "url": "https://haltseal.com/evaluate/?source=payment-control-lab#contact"
    },
    "input_digest": "0c7a0c8195c9d8622617c47a4eea78ca095d8da56fe1e7788385dff1a7fc5d6a",
    "ci": {
      "mode": "gate",
      "diagnostic_exit_code": 3,
      "process_exit_code": 3
    }
  }
}
