{
  "dataType": "authored-synthetic-only",
  "checkedAt": "2026-09-17",
  "productVersion": "0.2.3",
  "engineVersion": "0.2.2",
  "engineSha256": "d5cf9e1a7297d31a0446dbcadcc017a1eef0de3796b4e895ff61af9f2dd66eb5",
  "method": "UTF-8 CSV; positive amounts are expenses; analyzeCSV defaults; no bank connection; each CSV is analyzed separately.",
  "cases": [
    {
      "id": "monthly-contract",
      "title": "毎月の契約を想定した3件",
      "meaning": "毎月980円の候補が1件。契約中か、使っているかは管理画面で確かめます。",
      "sourceName": "monthly-contract.csv",
      "csvSha256": "3e0c31beaaa11ca122cef5ceff1f9ab53f30258c822403f18da219e7a124e0ba",
      "inputCount": 3,
      "acceptedCount": 3,
      "rejectedCount": 0,
      "rows": [
        [
          "2026-01-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-02-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-03-10",
          "架空動画サービス",
          980
        ]
      ],
      "transactions": [
        {
          "id": "tx-cabc9906",
          "date": "2026-01-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-contract.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-311c8746",
          "date": "2026-02-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-contract.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        },
        {
          "id": "tx-d7c8c08e",
          "date": "2026-03-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-contract.csv",
          "sourceRowIndex": 3,
          "sourceRowNumber": 4
        }
      ],
      "rejectedRows": [],
      "candidates": [
        {
          "id": "fcr-5f46e50d",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "frequency": "monthly",
          "frequencyLabel": "毎月",
          "transactionCount": 3,
          "transactions": [
            {
              "id": "tx-cabc9906",
              "date": "2026-01-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-contract.csv",
              "sourceRowIndex": 1,
              "sourceRowNumber": 2
            },
            {
              "id": "tx-311c8746",
              "date": "2026-02-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-contract.csv",
              "sourceRowIndex": 2,
              "sourceRowNumber": 3
            },
            {
              "id": "tx-d7c8c08e",
              "date": "2026-03-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-contract.csv",
              "sourceRowIndex": 3,
              "sourceRowNumber": 4
            }
          ],
          "confidence": 88,
          "confidenceLevel": "high",
          "reasons": [
            "3件の記録で、毎月の間隔が2/2回一致",
            "金額がほぼ一定（中央値 ¥980）",
            "観測期間 59日"
          ],
          "amount": {
            "median": 980,
            "min": 980,
            "max": 980,
            "average": 980,
            "variability": 0
          },
          "monthlyEstimate": 980,
          "annualEstimate": 11760,
          "nextExpectedDate": "2026-04-10",
          "intervalDays": {
            "median": 29.5,
            "min": 28,
            "max": 31
          },
          "firstDate": "2026-01-10",
          "lastDate": "2026-03-10",
          "reviewRecommended": false
        }
      ]
    },
    {
      "id": "monthly-shopping",
      "title": "毎月同日に同額を買う単発購入",
      "meaning": "単発購入を想定したデータでも毎月の候補が1件。周期が揃うだけではサブスクを証明できません。",
      "sourceName": "monthly-shopping.csv",
      "csvSha256": "b67c80e84ca7ebc6c011ef4ada0fa903b3056b2505b815dbe55c56f24fcd75ec",
      "inputCount": 3,
      "acceptedCount": 3,
      "rejectedCount": 0,
      "rows": [
        [
          "2026-01-10",
          "架空文具店",
          980
        ],
        [
          "2026-02-10",
          "架空文具店",
          980
        ],
        [
          "2026-03-10",
          "架空文具店",
          980
        ]
      ],
      "transactions": [
        {
          "id": "tx-990df82a",
          "date": "2026-01-10",
          "merchant": "架空文具店",
          "normalizedMerchant": "架空文具店",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-shopping.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-1c942c54",
          "date": "2026-02-10",
          "merchant": "架空文具店",
          "normalizedMerchant": "架空文具店",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-shopping.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        },
        {
          "id": "tx-1d1c237a",
          "date": "2026-03-10",
          "merchant": "架空文具店",
          "normalizedMerchant": "架空文具店",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "monthly-shopping.csv",
          "sourceRowIndex": 3,
          "sourceRowNumber": 4
        }
      ],
      "rejectedRows": [],
      "candidates": [
        {
          "id": "fcr-97c16041",
          "merchant": "架空文具店",
          "normalizedMerchant": "架空文具店",
          "frequency": "monthly",
          "frequencyLabel": "毎月",
          "transactionCount": 3,
          "transactions": [
            {
              "id": "tx-990df82a",
              "date": "2026-01-10",
              "merchant": "架空文具店",
              "normalizedMerchant": "架空文具店",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-shopping.csv",
              "sourceRowIndex": 1,
              "sourceRowNumber": 2
            },
            {
              "id": "tx-1c942c54",
              "date": "2026-02-10",
              "merchant": "架空文具店",
              "normalizedMerchant": "架空文具店",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-shopping.csv",
              "sourceRowIndex": 2,
              "sourceRowNumber": 3
            },
            {
              "id": "tx-1d1c237a",
              "date": "2026-03-10",
              "merchant": "架空文具店",
              "normalizedMerchant": "架空文具店",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "monthly-shopping.csv",
              "sourceRowIndex": 3,
              "sourceRowNumber": 4
            }
          ],
          "confidence": 88,
          "confidenceLevel": "high",
          "reasons": [
            "3件の記録で、毎月の間隔が2/2回一致",
            "金額がほぼ一定（中央値 ¥980）",
            "観測期間 59日"
          ],
          "amount": {
            "median": 980,
            "min": 980,
            "max": 980,
            "average": 980,
            "variability": 0
          },
          "monthlyEstimate": 980,
          "annualEstimate": 11760,
          "nextExpectedDate": "2026-04-10",
          "intervalDays": {
            "median": 29.5,
            "min": 28,
            "max": 31
          },
          "firstDate": "2026-01-10",
          "lastDate": "2026-03-10",
          "reviewRecommended": false
        }
      ]
    },
    {
      "id": "only-two-months",
      "title": "月払いの履歴が2件だけ",
      "meaning": "この版では月払いの候補は0件。3件必要な検出条件のためで、契約がないことを意味しません。",
      "sourceName": "only-two-months.csv",
      "csvSha256": "2ccfd072bba12fbc30a8f62b9dc1bfb3dc2f58b8418d744e3d8b1f6bada38c7a",
      "inputCount": 2,
      "acceptedCount": 2,
      "rejectedCount": 0,
      "rows": [
        [
          "2026-01-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-02-10",
          "架空動画サービス",
          980
        ]
      ],
      "transactions": [
        {
          "id": "tx-cabc9906",
          "date": "2026-01-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "only-two-months.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-311c8746",
          "date": "2026-02-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "only-two-months.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        }
      ],
      "rejectedRows": [],
      "candidates": []
    },
    {
      "id": "refund-present",
      "title": "3件の請求に1件の返金を追加",
      "meaning": "返金1行を除いて毎月の候補が1件。返金を請求と相殺して契約終了を判定する仕組みではありません。",
      "sourceName": "refund-present.csv",
      "csvSha256": "44b9cd456e9c706914af21b14d9ff291d44ecae17ce5782dbf612268b82177aa",
      "inputCount": 4,
      "acceptedCount": 3,
      "rejectedCount": 1,
      "rows": [
        [
          "2026-01-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-02-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-03-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-03-11",
          "架空動画サービス",
          -980
        ]
      ],
      "transactions": [
        {
          "id": "tx-cabc9906",
          "date": "2026-01-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "refund-present.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-311c8746",
          "date": "2026-02-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "refund-present.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        },
        {
          "id": "tx-d7c8c08e",
          "date": "2026-03-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "refund-present.csv",
          "sourceRowIndex": 3,
          "sourceRowNumber": 4
        }
      ],
      "rejectedRows": [
        {
          "rowIndex": 4,
          "rowNumber": 5,
          "reasons": [
            "refund_or_credit"
          ]
        }
      ],
      "candidates": [
        {
          "id": "fcr-5f46e50d",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "frequency": "monthly",
          "frequencyLabel": "毎月",
          "transactionCount": 3,
          "transactions": [
            {
              "id": "tx-cabc9906",
              "date": "2026-01-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "refund-present.csv",
              "sourceRowIndex": 1,
              "sourceRowNumber": 2
            },
            {
              "id": "tx-311c8746",
              "date": "2026-02-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "refund-present.csv",
              "sourceRowIndex": 2,
              "sourceRowNumber": 3
            },
            {
              "id": "tx-d7c8c08e",
              "date": "2026-03-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "refund-present.csv",
              "sourceRowIndex": 3,
              "sourceRowNumber": 4
            }
          ],
          "confidence": 88,
          "confidenceLevel": "high",
          "reasons": [
            "3件の記録で、毎月の間隔が2/2回一致",
            "金額がほぼ一定（中央値 ¥980）",
            "観測期間 59日"
          ],
          "amount": {
            "median": 980,
            "min": 980,
            "max": 980,
            "average": 980,
            "variability": 0
          },
          "monthlyEstimate": 980,
          "annualEstimate": 11760,
          "nextExpectedDate": "2026-04-10",
          "intervalDays": {
            "median": 29.5,
            "min": 28,
            "max": 31
          },
          "firstDate": "2026-01-10",
          "lastDate": "2026-03-10",
          "reviewRecommended": false
        }
      ]
    },
    {
      "id": "duplicate-export",
      "title": "重なった期間の同じ明細を追加",
      "meaning": "同日・同じ利用先・同額の1行を重複として除外。この条件で実際に2回購入した場合も除外されるため、件数は元の明細で確認します。",
      "sourceName": "duplicate-export.csv",
      "csvSha256": "02c7b66e10f0d901ead0962e716910e47f56e7482b98c8212eaa1cc6d85f6cd5",
      "inputCount": 4,
      "acceptedCount": 3,
      "rejectedCount": 1,
      "rows": [
        [
          "2026-01-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-02-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-03-10",
          "架空動画サービス",
          980
        ],
        [
          "2026-02-10",
          "架空動画サービス",
          980
        ]
      ],
      "transactions": [
        {
          "id": "tx-cabc9906",
          "date": "2026-01-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "duplicate-export.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-311c8746",
          "date": "2026-02-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "duplicate-export.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        },
        {
          "id": "tx-d7c8c08e",
          "date": "2026-03-10",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "duplicate-export.csv",
          "sourceRowIndex": 3,
          "sourceRowNumber": 4
        }
      ],
      "rejectedRows": [
        {
          "rowIndex": 4,
          "rowNumber": 5,
          "reasons": [
            "duplicate"
          ]
        }
      ],
      "candidates": [
        {
          "id": "fcr-5f46e50d",
          "merchant": "架空動画サービス",
          "normalizedMerchant": "架空動画サービス",
          "frequency": "monthly",
          "frequencyLabel": "毎月",
          "transactionCount": 3,
          "transactions": [
            {
              "id": "tx-cabc9906",
              "date": "2026-01-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "duplicate-export.csv",
              "sourceRowIndex": 1,
              "sourceRowNumber": 2
            },
            {
              "id": "tx-311c8746",
              "date": "2026-02-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "duplicate-export.csv",
              "sourceRowIndex": 2,
              "sourceRowNumber": 3
            },
            {
              "id": "tx-d7c8c08e",
              "date": "2026-03-10",
              "merchant": "架空動画サービス",
              "normalizedMerchant": "架空動画サービス",
              "amount": 980,
              "rawAmount": 980,
              "sourceName": "duplicate-export.csv",
              "sourceRowIndex": 3,
              "sourceRowNumber": 4
            }
          ],
          "confidence": 88,
          "confidenceLevel": "high",
          "reasons": [
            "3件の記録で、毎月の間隔が2/2回一致",
            "金額がほぼ一定（中央値 ¥980）",
            "観測期間 59日"
          ],
          "amount": {
            "median": 980,
            "min": 980,
            "max": 980,
            "average": 980,
            "variability": 0
          },
          "monthlyEstimate": 980,
          "annualEstimate": 11760,
          "nextExpectedDate": "2026-04-10",
          "intervalDays": {
            "median": 29.5,
            "min": 28,
            "max": 31
          },
          "firstDate": "2026-01-10",
          "lastDate": "2026-03-10",
          "reviewRecommended": false
        }
      ]
    },
    {
      "id": "annual-one-record",
      "title": "年払いの記録が1回だけ",
      "meaning": "候補は0件。年払いでも前年分がないと、年1回の周期を確認できません。",
      "sourceName": "annual-one-record.csv",
      "csvSha256": "e7c3a4902269399cd0bf2c1bbbf8cbfaaa7af2a9e13ed62127a0e71c3f303104",
      "inputCount": 1,
      "acceptedCount": 1,
      "rejectedCount": 0,
      "rows": [
        [
          "2026-03-10",
          "架空保管サービス",
          12000
        ]
      ],
      "transactions": [
        {
          "id": "tx-d8094df8",
          "date": "2026-03-10",
          "merchant": "架空保管サービス",
          "normalizedMerchant": "架空保管サービス",
          "amount": 12000,
          "rawAmount": 12000,
          "sourceName": "annual-one-record.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        }
      ],
      "rejectedRows": [],
      "candidates": []
    },
    {
      "id": "annual-two-records",
      "title": "前年と今年の年払い2件",
      "meaning": "年1回の候補が1件、月額換算1,000円。2件からの候補なので、次回の更新は契約先で確認します。",
      "sourceName": "annual-two-records.csv",
      "csvSha256": "695f51e0a6528f7ef7f6d28f417633bed0196dc31b92f6047146fe8aaf24b8a4",
      "inputCount": 2,
      "acceptedCount": 2,
      "rejectedCount": 0,
      "rows": [
        [
          "2025-03-10",
          "架空保管サービス",
          12000
        ],
        [
          "2026-03-10",
          "架空保管サービス",
          12000
        ]
      ],
      "transactions": [
        {
          "id": "tx-29e74f03",
          "date": "2025-03-10",
          "merchant": "架空保管サービス",
          "normalizedMerchant": "架空保管サービス",
          "amount": 12000,
          "rawAmount": 12000,
          "sourceName": "annual-two-records.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-db0952b1",
          "date": "2026-03-10",
          "merchant": "架空保管サービス",
          "normalizedMerchant": "架空保管サービス",
          "amount": 12000,
          "rawAmount": 12000,
          "sourceName": "annual-two-records.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        }
      ],
      "rejectedRows": [],
      "candidates": [
        {
          "id": "fcr-d7b28d11",
          "merchant": "架空保管サービス",
          "normalizedMerchant": "架空保管サービス",
          "frequency": "annual",
          "frequencyLabel": "年1回",
          "transactionCount": 2,
          "transactions": [
            {
              "id": "tx-29e74f03",
              "date": "2025-03-10",
              "merchant": "架空保管サービス",
              "normalizedMerchant": "架空保管サービス",
              "amount": 12000,
              "rawAmount": 12000,
              "sourceName": "annual-two-records.csv",
              "sourceRowIndex": 1,
              "sourceRowNumber": 2
            },
            {
              "id": "tx-db0952b1",
              "date": "2026-03-10",
              "merchant": "架空保管サービス",
              "normalizedMerchant": "架空保管サービス",
              "amount": 12000,
              "rawAmount": 12000,
              "sourceName": "annual-two-records.csv",
              "sourceRowIndex": 2,
              "sourceRowNumber": 3
            }
          ],
          "confidence": 66,
          "confidenceLevel": "medium",
          "reasons": [
            "2件の記録で、年1回の間隔が1/1回一致",
            "金額がほぼ一定（中央値 ¥12,000）",
            "観測期間 365日",
            "長周期の2件判定のため、明細での確認を推奨"
          ],
          "amount": {
            "median": 12000,
            "min": 12000,
            "max": 12000,
            "average": 12000,
            "variability": 0
          },
          "monthlyEstimate": 1000,
          "annualEstimate": 12000,
          "nextExpectedDate": "2027-03-10",
          "intervalDays": {
            "median": 365,
            "min": 365,
            "max": 365
          },
          "firstDate": "2025-03-10",
          "lastDate": "2026-03-10",
          "reviewRecommended": true
        }
      ]
    },
    {
      "id": "generic-description",
      "title": "利用先が「カード利用」としか書かれていない",
      "meaning": "周期が揃っていても候補は0件。利用先を特定できない一般名は除外するため、元のサービス名がある明細が必要です。",
      "sourceName": "generic-description.csv",
      "csvSha256": "f682c2a481a40814480d9e68f9f7c5549656c7e3bb8ce66dfd295b924d8b33b2",
      "inputCount": 3,
      "acceptedCount": 3,
      "rejectedCount": 0,
      "rows": [
        [
          "2026-01-10",
          "カード利用",
          980
        ],
        [
          "2026-02-10",
          "カード利用",
          980
        ],
        [
          "2026-03-10",
          "カード利用",
          980
        ]
      ],
      "transactions": [
        {
          "id": "tx-18d85bf2",
          "date": "2026-01-10",
          "merchant": "カード利用",
          "normalizedMerchant": "カード利用",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "generic-description.csv",
          "sourceRowIndex": 1,
          "sourceRowNumber": 2
        },
        {
          "id": "tx-849e5084",
          "date": "2026-02-10",
          "merchant": "カード利用",
          "normalizedMerchant": "カード利用",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "generic-description.csv",
          "sourceRowIndex": 2,
          "sourceRowNumber": 3
        },
        {
          "id": "tx-5b81b292",
          "date": "2026-03-10",
          "merchant": "カード利用",
          "normalizedMerchant": "カード利用",
          "amount": 980,
          "rawAmount": 980,
          "sourceName": "generic-description.csv",
          "sourceRowIndex": 3,
          "sourceRowNumber": 4
        }
      ],
      "rejectedRows": [],
      "candidates": []
    }
  ]
}
