{
  "generatedAt": "2026-09-08T21:28:41.345Z",
  "method": "Browser screenshots and HTML from a controlled local page before and after an edit. Existing Kiroku comparison and notification selection code; local asset provider and intercepted email provider. No production capture, scheduler, TSA, billing or email delivery was exercised.",
  "sourceFileSha256": {
    "src/lib/archive-diff.ts": "eb8db9313007d08d305eef1b0965db7a7dea966070a386d822467ec5fd0cca17",
    "src/lib/archive-bundle.ts": "a2ab8cca8599d8428137a0ae21d19de921e690a00901519ad6f2b91ee839e3cc",
    "src/lib/archive-html-sanitize.ts": "b84b9577f4bcf4aabbf6a917f01698609422a3b4644275385e31feb5e0579540",
    "src/lib/url-monitoring.ts": "40618f44cfe35638410d0561de543273693290fda382be8bbc62894d4b339113",
    "src/lib/url-monitor-email.ts": "9ffedf3d585a4b3af43ecd902a6c704057e1577417967df0ea95daffa326b69d"
  },
  "cases": [
    {
      "id": "pricing-ja",
      "lang": "ja",
      "scenario": "pricing",
      "sourceUrl": "http://127.0.0.1:8868/pricing-ja",
      "before": {
        "title": "料金プラン | Sample Service",
        "capturedAt": "2026-09-08T21:28:38.411Z",
        "htmlPath": "/samples/monitoring/pricing-ja-before.html",
        "screenshotPath": "/samples/monitoring/pricing-ja-before.png",
        "htmlSha256": "a487efd89978e0d051adbd206b9506863ece4b8fa8a1ed64edf950dafa2e0ac4",
        "screenshotSha256": "a7e2ee04244593cd67d5c3e7ed39cbf8030a6cdfe676cd46e106b22e776c769f"
      },
      "after": {
        "title": "料金プラン | Sample Service",
        "capturedAt": "2026-09-08T21:28:38.808Z",
        "htmlPath": "/samples/monitoring/pricing-ja-after.html",
        "screenshotPath": "/samples/monitoring/pricing-ja-after.png",
        "htmlSha256": "6ee0b7c4b10b4b94307006e3d9668c43ad916d2f053a1e289a11889b48b9a2fa",
        "screenshotSha256": "fe7fb72f42b50200c303e27e7d9421d6499cfad9a717b06d5ed8bc44e0556388"
      },
      "changeTypes": [
        "text",
        "visual"
      ],
      "textDiffBlocks": [
        {
          "type": "changed",
          "before": "月額料金：6,000円\n保存上限：100件",
          "after": "月額料金：8,000円\n保存上限：50件",
          "beforeLines": 2,
          "afterLines": 2,
          "beforeTruncated": false,
          "afterTruncated": false
        }
      ],
      "textDiffStats": {
        "changedBlocks": 1,
        "addedLines": 2,
        "removedLines": 2,
        "truncatedBlocks": 0
      },
      "notificationPath": "/samples/monitoring/pricing-ja-notification.txt",
      "checks": {
        "sameResource": true,
        "textChanged": true,
        "visualChanged": true,
        "notificationEligible": true,
        "unchangedControlPassed": true
      }
    },
    {
      "id": "terms-ja",
      "lang": "ja",
      "scenario": "terms",
      "sourceUrl": "http://127.0.0.1:8868/terms-ja",
      "before": {
        "title": "利用規約 | Sample Service",
        "capturedAt": "2026-09-08T21:28:39.245Z",
        "htmlPath": "/samples/monitoring/terms-ja-before.html",
        "screenshotPath": "/samples/monitoring/terms-ja-before.png",
        "htmlSha256": "eceac714c35a9ae79b76e75f53741cc31de029fdba3847622394fbdc056a98a5",
        "screenshotSha256": "a615fb8a217ea701464b828cae520e204666f3615a5189b9e53c0cf05f20a8c1"
      },
      "after": {
        "title": "利用規約 | Sample Service",
        "capturedAt": "2026-09-08T21:28:39.642Z",
        "htmlPath": "/samples/monitoring/terms-ja-after.html",
        "screenshotPath": "/samples/monitoring/terms-ja-after.png",
        "htmlSha256": "37993815308a8f6d8568f1142b6f9133cce284a505791fe427c848e3e99aa1a2",
        "screenshotSha256": "40c33e10ec7cec0f94224a645aaff752eaa439b0f10f783763c07b3d55378223"
      },
      "changeTypes": [
        "text",
        "visual"
      ],
      "textDiffBlocks": [
        {
          "type": "changed",
          "before": "解約のお申し出は更新日の30日前までにご連絡ください。",
          "after": "解約のお申し出は更新日の45日前までにご連絡ください。",
          "beforeLines": 1,
          "afterLines": 1,
          "beforeTruncated": false,
          "afterTruncated": false
        }
      ],
      "textDiffStats": {
        "changedBlocks": 1,
        "addedLines": 1,
        "removedLines": 1,
        "truncatedBlocks": 0
      },
      "notificationPath": "/samples/monitoring/terms-ja-notification.txt",
      "checks": {
        "sameResource": true,
        "textChanged": true,
        "visualChanged": true,
        "notificationEligible": true,
        "unchangedControlPassed": true
      }
    },
    {
      "id": "pricing-en",
      "lang": "en",
      "scenario": "pricing",
      "sourceUrl": "http://127.0.0.1:8868/pricing-en",
      "before": {
        "title": "Pricing | Sample Service",
        "capturedAt": "2026-09-08T21:28:40.107Z",
        "htmlPath": "/samples/monitoring/pricing-en-before.html",
        "screenshotPath": "/samples/monitoring/pricing-en-before.png",
        "htmlSha256": "e781d0ec4a0e60b55beb06132a24619fee9667f24d64828d128427a79a631b01",
        "screenshotSha256": "5d779484700b3cb2af5572fcf2165e3e5273d28402486b18128e4952178327f9"
      },
      "after": {
        "title": "Pricing | Sample Service",
        "capturedAt": "2026-09-08T21:28:40.525Z",
        "htmlPath": "/samples/monitoring/pricing-en-after.html",
        "screenshotPath": "/samples/monitoring/pricing-en-after.png",
        "htmlSha256": "8da17b0ac62887377e428b06e3a64f152b197cfbe215830c302be29e2f1cdd4e",
        "screenshotSha256": "59bdd2f3e1c947ede18a0e2050b5f3f8c17e911e345c83920f4979ceebd99d72"
      },
      "changeTypes": [
        "text",
        "visual"
      ],
      "textDiffBlocks": [
        {
          "type": "changed",
          "before": "Monthly price: $40\nSaved page limit: 100",
          "after": "Monthly price: $55\nSaved page limit: 50",
          "beforeLines": 2,
          "afterLines": 2,
          "beforeTruncated": false,
          "afterTruncated": false
        }
      ],
      "textDiffStats": {
        "changedBlocks": 1,
        "addedLines": 2,
        "removedLines": 2,
        "truncatedBlocks": 0
      },
      "notificationPath": "/samples/monitoring/pricing-en-notification.txt",
      "checks": {
        "sameResource": true,
        "textChanged": true,
        "visualChanged": true,
        "notificationEligible": true,
        "unchangedControlPassed": true
      }
    },
    {
      "id": "terms-en",
      "lang": "en",
      "scenario": "terms",
      "sourceUrl": "http://127.0.0.1:8868/terms-en",
      "before": {
        "title": "Terms of service | Sample Service",
        "capturedAt": "2026-09-08T21:28:40.944Z",
        "htmlPath": "/samples/monitoring/terms-en-before.html",
        "screenshotPath": "/samples/monitoring/terms-en-before.png",
        "htmlSha256": "7a698eceb668ba126dbb6d28b737b359161eb8621e843f975815765c9e8b2ae3",
        "screenshotSha256": "7e0be847aec4dc27f09fd230ed12bc3d110672bc0771d64412f7f8f37c1b9ad1"
      },
      "after": {
        "title": "Terms of service | Sample Service",
        "capturedAt": "2026-09-08T21:28:41.343Z",
        "htmlPath": "/samples/monitoring/terms-en-after.html",
        "screenshotPath": "/samples/monitoring/terms-en-after.png",
        "htmlSha256": "b8aa7da1275f376c261fca11692a7ebd68ddb1377463512007f541b5824fb0bf",
        "screenshotSha256": "f4c10ddef4d7600fc1fa43b749bb1b8a9011930d90399d4dedd02e8f4555f68f"
      },
      "changeTypes": [
        "text",
        "visual"
      ],
      "textDiffBlocks": [
        {
          "type": "changed",
          "before": "Send your cancellation request at least 30 days before renewal.",
          "after": "Send your cancellation request at least 45 days before renewal.",
          "beforeLines": 1,
          "afterLines": 1,
          "beforeTruncated": false,
          "afterTruncated": false
        }
      ],
      "textDiffStats": {
        "changedBlocks": 1,
        "addedLines": 1,
        "removedLines": 1,
        "truncatedBlocks": 0
      },
      "notificationPath": "/samples/monitoring/terms-en-notification.txt",
      "checks": {
        "sameResource": true,
        "textChanged": true,
        "visualChanged": true,
        "notificationEligible": true,
        "unchangedControlPassed": true
      }
    }
  ]
}
