{
  "process_id": "FA-02",
  "policy_version": "synthetic-v1",
  "event_id": "fa-02-example-v1",
  "input": {
    "entity": "LENDER-1",
    "currency": "USD",
    "cutoff": "2026-10-31T23:59:59Z",
    "window_start": "2026-10-01T00:00:00Z",
    "events": [
      {
        "entity": "LENDER-1",
        "currency": "USD",
        "known_at": "2026-10-31T23:59:59Z",
        "event_id": "F1",
        "loan_id": "L1",
        "revision": 1,
        "event_date": "2026-10-30",
        "principal_cents": 30000000,
        "approved_fee_cents": 100000
      }
    ],
    "policy": {
      "version": "P1",
      "valid_from": "2026-01-01",
      "valid_to": "2026-12-31",
      "known_at": "2026-01-01T00:00:00Z",
      "principal_debit": "synthetic_loan_asset",
      "principal_credit": "synthetic_cash",
      "fee_debit": "synthetic_fee_receivable",
      "fee_credit": "synthetic_fee_revenue"
    },
    "open_periods": [
      "2026-10"
    ],
    "posted_keys": [],
    "manifest": {
      "events": {
        "as_of": "2026-10-31T23:59:59Z",
        "known_at": "2026-10-31T23:59:59Z",
        "expected_records": 1,
        "received_records": 1,
        "complete": true
      }
    }
  },
  "expected": {
    "status": "ready_for_review",
    "journals": [
      {
        "journal_key": "LENDER-1:F1:1:P1",
        "lines": [
          {
            "account": "synthetic_loan_asset",
            "debit_cents": 30000000,
            "credit_cents": 0
          },
          {
            "account": "synthetic_cash",
            "debit_cents": 0,
            "credit_cents": 30000000
          },
          {
            "account": "synthetic_fee_receivable",
            "debit_cents": 100000,
            "credit_cents": 0
          },
          {
            "account": "synthetic_fee_revenue",
            "debit_cents": 0,
            "credit_cents": 100000
          }
        ],
        "debit_cents": 30100000,
        "credit_cents": 30100000
      }
    ],
    "total_debit_cents": 30100000,
    "errors": []
  },
  "changes": [
    {
      "name": "Previously posted event cannot be drafted again",
      "path": [
        "posted_keys"
      ],
      "value": [
        "LENDER-1:F1:1:P1"
      ],
      "expected": {
        "status": "hold",
        "journals": [
          {
            "journal_key": "LENDER-1:F1:1:P1",
            "lines": [
              {
                "account": "synthetic_loan_asset",
                "debit_cents": 30000000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_cash",
                "debit_cents": 0,
                "credit_cents": 30000000
              },
              {
                "account": "synthetic_fee_receivable",
                "debit_cents": 100000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_fee_revenue",
                "debit_cents": 0,
                "credit_cents": 100000
              }
            ],
            "debit_cents": 30100000,
            "credit_cents": 30100000
          }
        ],
        "total_debit_cents": 30100000,
        "errors": [
          "F1:already_posted"
        ]
      }
    },
    {
      "name": "Policy change does not bypass prior source-event posting",
      "path": [
        "posted_keys"
      ],
      "value": [
        "LENDER-1:F1:1:OLD-POLICY"
      ],
      "expected": {
        "status": "hold",
        "journals": [
          {
            "journal_key": "LENDER-1:F1:1:P1",
            "lines": [
              {
                "account": "synthetic_loan_asset",
                "debit_cents": 30000000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_cash",
                "debit_cents": 0,
                "credit_cents": 30000000
              },
              {
                "account": "synthetic_fee_receivable",
                "debit_cents": 100000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_fee_revenue",
                "debit_cents": 0,
                "credit_cents": 100000
              }
            ],
            "debit_cents": 30100000,
            "credit_cents": 30100000
          }
        ],
        "total_debit_cents": 30100000,
        "errors": [
          "F1:already_posted"
        ]
      }
    },
    {
      "name": "Closed accounting period",
      "path": [
        "open_periods"
      ],
      "value": [],
      "expected": {
        "status": "hold",
        "journals": [
          {
            "journal_key": "LENDER-1:F1:1:P1",
            "lines": [
              {
                "account": "synthetic_loan_asset",
                "debit_cents": 30000000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_cash",
                "debit_cents": 0,
                "credit_cents": 30000000
              },
              {
                "account": "synthetic_fee_receivable",
                "debit_cents": 100000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_fee_revenue",
                "debit_cents": 0,
                "credit_cents": 100000
              }
            ],
            "debit_cents": 30100000,
            "credit_cents": 30100000
          }
        ],
        "total_debit_cents": 30100000,
        "errors": [
          "F1:closed_period"
        ]
      }
    },
    {
      "name": "Blank GL mapping holds",
      "path": [
        "policy",
        "principal_debit"
      ],
      "value": " ",
      "expected": {
        "status": "hold",
        "errors": [
          "invalid_input:policy.principal_debit:expected_nonblank_trimmed_text"
        ]
      }
    },
    {
      "name": "Expired mapping at the event date",
      "path": [
        "policy",
        "valid_to"
      ],
      "value": "2026-10-15",
      "expected": {
        "status": "hold",
        "journals": [
          {
            "journal_key": "LENDER-1:F1:1:P1",
            "lines": [
              {
                "account": "synthetic_loan_asset",
                "debit_cents": 30000000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_cash",
                "debit_cents": 0,
                "credit_cents": 30000000
              },
              {
                "account": "synthetic_fee_receivable",
                "debit_cents": 100000,
                "credit_cents": 0
              },
              {
                "account": "synthetic_fee_revenue",
                "debit_cents": 0,
                "credit_cents": 100000
              }
            ],
            "debit_cents": 30100000,
            "credit_cents": 30100000
          }
        ],
        "total_debit_cents": 30100000,
        "errors": [
          "F1:no_effective_mapping"
        ]
      }
    },
    {
      "name": "Malformed date cannot pass",
      "path": [
        "events",
        0,
        "event_date"
      ],
      "value": "2026-02-30",
      "expected": {
        "status": "hold",
        "errors": [
          "invalid_input:event_date:invalid_date"
        ]
      }
    },
    {
      "name": "Missing source page is an incomplete population",
      "path": [
        "manifest",
        "events",
        "received_records"
      ],
      "value": 0,
      "expected": {
        "status": "hold",
        "errors": [
          "invalid_input:events:incomplete_population"
        ]
      }
    },
    {
      "name": "Malformed source timestamp holds",
      "path": [
        "manifest",
        "events",
        "known_at"
      ],
      "value": "2026-13-32T00:00:00Z",
      "expected": {
        "status": "hold",
        "errors": [
          "invalid_input:events.known_at:invalid_utc_timestamp"
        ]
      }
    },
    {
      "name": "Old source as-of cannot satisfy the declared exact cutoff",
      "path": [
        "manifest",
        "events",
        "as_of"
      ],
      "value": "2026-10-01T00:00:00Z",
      "expected": {
        "status": "hold",
        "errors": [
          "invalid_input:events:invalid_source_cutoff"
        ]
      }
    }
  ]
}
