{
  "schema_version": "1.0",
  "experiment_id": "AIEL-2026-0004",
  "legacy_id": "SWITCHBOT-CO2-LINE-ALERT-001",
  "source_type": "backfill",
  "title": {
    "en": "SwitchBot CO2 alerts to a family LINE group with Google Apps Script",
    "ja": "SwitchBot CO₂をGoogle Apps Scriptで判定し家族LINEグループへ換気通知する"
  },
  "status": "COMPLETED",
  "timestamps": {
    "created_at": "2026-08-23T08:13:27+09:00",
    "started_at": "2026-08-16T16:38:00+09:00",
    "observed_at": "2026-08-16T16:38:00+09:00",
    "completed_at": "2026-08-27T06:03:22+09:00",
    "published_at": "2026-08-22T23:38:49+00:00",
    "last_verified": "2026-08-27T06:03:22+09:00",
    "updated_at": "2026-09-02T00:16:04+09:00"
  },
  "objective": {
    "summary_en": "Extend an existing SwitchBot CO2 collection path with persistence, hysteresis, and LINE Messaging API push notifications so household members receive a ventilation warning only when a qualifying high-CO2 state is detected.",
    "summary_ja": "既存のSwitchBot CO₂収集経路に継続判定・ヒステリシス・LINE Messaging API Push通知を追加し、条件を満たす高CO₂状態でのみ家族へ換気警告を送る。",
    "success_criteria": [
      {
        "id": "SC-001",
        "description_en": "Verify the initial end-to-end path from CO2 measurement through state judgement to delivery in the intended private LINE group.",
        "description_ja": "CO₂測定から状態判定、意図した非公開LINEグループへの通知到達までの初回警報経路を実動確認する。"
      },
      {
        "id": "SC-002",
        "description_en": "Verify the repeated-warning behavior after the configured 30-minute notification interval while the qualifying high-CO2 state continues.",
        "description_ja": "高CO₂状態が継続する場合に、設定した30分の通知間隔後に再警告されることを実動確認する。"
      },
      {
        "id": "SC-003",
        "description_en": "Verify the silent reset effect after CO2 remains below 900 ppm for at least 10 minutes and verify that a later qualifying high-CO2 state produces a new initial alert.",
        "description_ja": "CO₂が900 ppm未満で10分以上継続した後に無通知で警報状態が解除された効果を確認し、その後の新しい高CO₂状態で初回警報として再発報されることを実動確認する。"
      }
    ],
    "partial_success_criteria": [],
    "failure_criteria": []
  },
  "scope": {
    "included": [
      "SwitchBot MeterPro(CO2) measurement path",
      "SwitchBot Hub Mini W0202200 cloud relay and data-collection path",
      "SwitchBot OpenAPI v1.1",
      "Google Apps Script approximately five-minute collection trigger",
      "CO2 alert persistence and hysteresis logic",
      "LINE Messaging API push delivery",
      "One-time Cloudflare Worker webhook workaround for private group ID capture"
    ],
    "excluded": [
      "Publication excludes authentication or authorization secrets, identifying information, private raw observation data, and sensitive internal system or network details that are not needed to understand or reproduce the experiment."
    ],
    "limitations": [
      "Raw household time-series data and private LINE screenshots are intentionally not published.",
      "The temporary Cloudflare Worker used only for group-ID capture was deleted after setup.",
      "Deliberate fault injection for missing CO2 samples and SwitchBot API errors was not performed; this is additional validation outside the principal success criteria rather than an unresolved defect."
    ]
  },
  "environment": {
    "hardware": [
      {
        "role": "co2_sensor",
        "manufacturer": "SwitchBot",
        "model": "MeterPro(CO2)",
        "revision": null,
        "serial_number_public": false,
        "notes": "Experiment-used CO2 sensor; device-specific identifiers are withheld."
      },
      {
        "role": "data_collection_hub",
        "manufacturer": "SwitchBot",
        "model": "W0202200",
        "revision": null,
        "serial_number_public": false,
        "notes": "SwitchBot Hub Mini; input 5 V / 1 A; Japanese radio certification 210-130568. The same physical Hub Mini whose equipment details were recorded in AIEL-2026-0006 was used to make MeterPro(CO2) measurements available through the SwitchBot cloud/OpenAPI path."
      }
    ],
    "software": [
      {
        "name": "Google Apps Script",
        "version": null,
        "role": "measurement scheduling, state judgement, and LINE push invocation"
      },
      {
        "name": "LINE Messaging API",
        "version": null,
        "role": "push notification delivery to a private group"
      },
      {
        "name": "Cloudflare Workers",
        "version": null,
        "role": "temporary signed webhook receiver used only to obtain the private LINE group ID"
      },
      {
        "name": "Google Sheets",
        "version": null,
        "role": "private measurement logging"
      }
    ],
    "firmware": [],
    "network": {
      "type": "internet_cloud_api",
      "ip_addresses_redacted": true,
      "protocols_observed": [
        "HTTPS"
      ],
      "notes": "Production data collection uses MeterPro(CO2) via Hub Mini to the SwitchBot cloud/OpenAPI path, followed by Google Apps Script and LINE cloud APIs; Cloudflare was only a temporary setup dependency."
    },
    "environmental_conditions": []
  },
  "hypotheses": [
    {
      "id": "H-001",
      "statement_en": "The initial alert path can deliver a ventilation warning to the intended private LINE group after the configured high-CO2 condition is met.",
      "statement_ja": "設定した高CO₂条件成立後、初回換気警告を意図した非公開LINEグループへ届けられる。",
      "status": "SUPPORTED",
      "created_at": null,
      "evidence_refs": [
        "O-001",
        "O-004"
      ]
    },
    {
      "id": "H-002",
      "statement_en": "The implementation can send a repeated warning after the configured repeat interval while the qualifying high-CO2 state persists or re-qualifies.",
      "statement_ja": "高CO₂条件が継続または再成立した場合、設定した再通知間隔後に再警告できる。",
      "status": "SUPPORTED",
      "created_at": null,
      "evidence_refs": [
        "O-004",
        "O-005"
      ]
    },
    {
      "id": "H-003",
      "statement_en": "The implementation silently returns from ALERT to NORMAL after CO2 remains below 900 ppm for at least 10 minutes.",
      "statement_ja": "CO₂が900 ppm未満で10分以上継続すると、通知せずALERTからNORMALへ復帰する。",
      "status": "SUPPORTED",
      "created_at": null,
      "evidence_refs": [
        "O-006",
        "O-007"
      ]
    },
    {
      "id": "H-004",
      "statement_en": "After the silent reset, a later qualifying high-CO2 state is treated as a new initial alert rather than a continuation of the previous alert.",
      "statement_ja": "無通知解除後に再び高CO₂条件が成立した場合、前回警報の継続ではなく新しい初回警報として扱われる。",
      "status": "SUPPORTED",
      "created_at": "2026-08-27T06:03:22+09:00",
      "evidence_refs": [
        "O-006",
        "O-007"
      ]
    }
  ],
  "procedures": [],
  "actions": [
    {
      "id": "A-001",
      "type": "integration_setup",
      "description": {
        "en": "Connected the existing SwitchBot CO2 collection path to alert-state logic and LINE Messaging API push delivery.",
        "ja": "既存のSwitchBot CO₂収集経路へ警報状態判定とLINE Messaging API Push通知を接続した。"
      },
      "actor": {
        "type": "HUMAN",
        "role": "operator"
      },
      "state": "EXECUTED",
      "executed_at": null,
      "result_refs": [
        "O-001"
      ]
    },
    {
      "id": "A-002",
      "type": "functional_test",
      "description": {
        "en": "Deliberately exhaled near the installed CO2 sensor to raise the reading for an end-to-end functional test.",
        "ja": "エンドツーエンド機能試験として設置済みCO₂センサー付近で呼気を与え、測定値を意図的に上昇させた。"
      },
      "actor": {
        "type": "HUMAN",
        "role": "operator"
      },
      "state": "EXECUTED",
      "executed_at": "2026-08-16T16:38:00+09:00",
      "result_refs": [
        "O-001"
      ]
    },
    {
      "id": "A-003",
      "type": "webhook_workaround",
      "description": {
        "en": "Used a temporary Cloudflare Worker to receive and validate a LINE webhook and capture the private group ID after the Apps Script Web App path returned HTTP 302.",
        "ja": "Apps Script Web App経路がHTTP 302となったため、一時的なCloudflare WorkerでLINE Webhookを受信・署名検証し、非公開groupIdを取得した。"
      },
      "actor": {
        "type": "HUMAN",
        "role": "operator"
      },
      "state": "EXECUTED",
      "executed_at": null,
      "result_refs": [
        "O-002",
        "O-003"
      ]
    },
    {
      "id": "A-004",
      "type": "repeat_alert_runtime_test",
      "description": {
        "en": "Observed an initial warning followed by a repeated warning 30 minutes later while the same qualifying high-CO2 state continued and cross-checked both events against the private Google Sheets runtime log.",
        "ja": "同一の高CO₂条件中に初回警報と30分後の再警告を観測し、両イベントを非公開Google Sheets実行ログと照合した。"
      },
      "actor": {
        "type": "HUMAN",
        "role": "operator"
      },
      "state": "EXECUTED",
      "executed_at": "2026-08-26T07:48:20+09:00",
      "result_refs": [
        "O-004",
        "O-005"
      ]
    },
    {
      "id": "A-005",
      "type": "reset_and_realert_runtime_test",
      "description": {
        "en": "After the measurement log showed CO2 below 900 ppm for at least 10 minutes, deliberately raised CO2 again and observed that the next notification was logged and delivered as a new INITIAL alert.",
        "ja": "測定ログでCO₂が900 ppm未満の状態を10分以上確認した後、再びCO₂を意図的に上昇させ、次の通知が新しいINITIAL警報として記録・配信されることを観測した。"
      },
      "actor": {
        "type": "HUMAN",
        "role": "operator"
      },
      "state": "EXECUTED",
      "executed_at": "2026-08-27T06:03:22+09:00",
      "result_refs": [
        "O-006",
        "O-007"
      ]
    }
  ],
  "observations": [
    {
      "id": "O-001",
      "timestamp": "2026-08-16T16:38:00+09:00",
      "description_en": "The intended private LINE group received a ventilation warning showing 2812 ppm and a displayed high-CO2 continuation time of 4 minutes after the deliberate functional test.",
      "description_ja": "意図的な機能試験後、対象の非公開LINEグループに換気警告が届き、現在値2812 ppm、高CO₂継続4分と表示された。",
      "observation_type": "notification",
      "source_type": "human_observation",
      "artifact_refs": [
        "AR-001"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-002",
      "timestamp": null,
      "description_en": "The direct Google Apps Script Web App webhook attempt returned HTTP 302 after deployment/URL correction and was not retained as the group-ID capture path.",
      "description_ja": "Google Apps Script Web Appを直接Webhook受信先とした経路は、デプロイ・URL修正後もHTTP 302となり、groupId取得経路として継続採用しなかった。",
      "observation_type": "http_response",
      "source_type": "human_observation",
      "artifact_refs": [
        "AR-001"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-003",
      "timestamp": null,
      "description_en": "LINE webhook verification succeeded through the temporary Cloudflare Worker; after the group ID was captured and stored privately, the Worker was deleted and webhook delivery was disabled.",
      "description_ja": "一時的なCloudflare WorkerではLINE Webhook検証に成功し、groupIdを取得して非公開保存した後、Workerを削除しWebhook利用をOFFにした。",
      "observation_type": "integration",
      "source_type": "human_observation",
      "artifact_refs": [
        "AR-001"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-004",
      "timestamp": "2026-08-26T07:18:20+09:00",
      "description_en": "A new initial ventilation warning reached the private LINE group showing 1006 ppm and a displayed high-CO2 continuation time of 4 minutes. The private runtime log independently recorded CO2Alert SUCCESS with 'INITIAL notification sent'.",
      "description_ja": "新しい初回換気警告が非公開LINEグループに届き、現在値1006 ppm、高CO₂継続4分と表示された。非公開実行ログにもCO2Alert SUCCESSとして「INITIAL通知を送信しました。」と記録された。",
      "observation_type": "notification_and_runtime_log",
      "source_type": "cross_checked_private_runtime_evidence",
      "artifact_refs": [
        "AR-002"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-005",
      "timestamp": "2026-08-26T07:48:20+09:00",
      "description_en": "Exactly 30 minutes after the initial runtime log entry, the private LINE group received a CO2 repeated warning showing 1032 ppm and a displayed high-CO2 continuation time of 35 minutes. The private runtime log recorded CO2Alert SUCCESS with 'REPEAT notification sent'.",
      "description_ja": "初回警報の実行ログからちょうど30分後、非公開LINEグループにCO₂再警告が届き、現在値1032 ppm、高CO₂継続35分と表示された。非公開実行ログにはCO2Alert SUCCESSとして「REPEAT通知を送信しました。」と記録された。",
      "observation_type": "notification_and_runtime_log",
      "source_type": "cross_checked_private_runtime_evidence",
      "artifact_refs": [
        "AR-002"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-006",
      "timestamp": "2026-08-26T08:48:00+09:00",
      "description_en": "The retained private measurement log showed the living-room CO2 concentration below 900 ppm for at least 10 minutes after the repeated-warning period. No clear-state LINE message was sent, as designed.",
      "description_ja": "再警告後、非公開測定ログでリビングのCO₂濃度が900 ppm未満の状態を10分以上継続したことを確認した。設計どおり解除通知は送信されなかった。",
      "observation_type": "measurement_state_transition",
      "source_type": "private_measurement_log",
      "artifact_refs": [
        "AR-002"
      ],
      "quality": "VALID"
    },
    {
      "id": "O-007",
      "timestamp": "2026-08-27T06:03:22+09:00",
      "description_en": "After CO2 was deliberately raised again on the next day, the private LINE group received a ventilation warning showing 2123 ppm and a displayed high-CO2 continuation time of 4 minutes. The private runtime log recorded CO2Alert SUCCESS with 'INITIAL notification sent', demonstrating the externally observable effect of the prior silent reset and showing that the later qualifying high-CO2 state was treated as a new initial alert.",
      "description_ja": "翌日に再びCO₂を意図的に上昇させたところ、非公開LINEグループに現在値2123 ppm、高CO₂継続4分の換気警告が届いた。非公開実行ログはCO2Alert SUCCESSとして「INITIAL通知を送信しました。」を記録しており、前回の無通知解除の効果と、その後に再び高CO₂状態になった際に新しい初回警報として扱われることを外部挙動として確認した。",
      "observation_type": "post_reset_notification_and_runtime_log",
      "source_type": "cross_checked_private_runtime_evidence",
      "artifact_refs": [
        "AR-002"
      ],
      "quality": "VALID"
    }
  ],
  "claims": [
    {
      "id": "C-001",
      "statement_en": "The initial end-to-end CO2 alert path from measurement through automated state judgement to LINE push delivery operated successfully in functional tests.",
      "statement_ja": "機能試験において、CO₂測定から自動状態判定、LINE Push通知到達までの初回警報経路が正常に動作した。",
      "evidence_state": "VERIFIED",
      "confidence": "HIGH",
      "evidence_refs": [
        "O-001",
        "O-004"
      ],
      "source_refs": []
    },
    {
      "id": "C-002",
      "statement_en": "The configured repeated-warning branch operated at runtime: an INITIAL alert at 07:18:20 was followed by a REPEAT alert at 07:48:20, exactly 30 minutes later, while the same qualifying high-CO2 state continued.",
      "statement_ja": "設定した再警告分岐は実動し、07:18:20のINITIAL警報からちょうど30分後の07:48:20に同一の高CO₂状態でREPEAT警報が送信された。",
      "evidence_state": "VERIFIED",
      "confidence": "HIGH",
      "evidence_refs": [
        "O-004",
        "O-005"
      ],
      "source_refs": []
    },
    {
      "id": "C-003",
      "statement_en": "The silent-clear behavior after at least 10 minutes below 900 ppm produced the expected state-transition effect: no clear message was sent, and a later qualifying high-CO2 state was treated as a new initial alert.",
      "statement_ja": "900 ppm未満が10分以上継続した後の無通知解除は期待どおりの状態遷移効果を示し、解除通知は送られず、その後に再び成立した高CO₂状態は新しい初回警報として扱われた。",
      "evidence_state": "VERIFIED",
      "confidence": "HIGH",
      "evidence_refs": [
        "O-006",
        "O-007"
      ],
      "source_refs": []
    },
    {
      "id": "C-004",
      "statement_en": "After the reset interval, the system successfully re-alerted as INITIAL rather than REPEAT when a later qualifying high-CO2 state was deliberately induced.",
      "statement_ja": "解除条件成立後、再び高CO₂状態を意図的に発生させると、REPEATではなくINITIALとして正常に再発報した。",
      "evidence_state": "VERIFIED",
      "confidence": "HIGH",
      "evidence_refs": [
        "O-007"
      ],
      "source_refs": []
    }
  ],
  "analysis": [
    {
      "id": "AN-001",
      "method": "cross_checked_state_transition_verification",
      "summary_en": "The principal alert-state branches are separated and verified from direct runtime evidence: initial delivery, a 30-minute repeated warning, a sustained-low interval with no clear message, and a later new INITIAL alert. Private LINE observations and Google Sheets runtime logs were cross-checked so the conclusion does not rely only on intended implementation logic.",
      "summary_ja": "主要な警報状態分岐を分離し、初回通知、30分再警告、解除通知なしの低CO₂継続、新しいINITIAL再発報を実動Evidenceで検証した。非公開LINE観測とGoogle Sheets実行ログを照合し、実装意図だけに依存しない結論とした。",
      "evidence_refs": [
        "O-001",
        "O-004",
        "O-005",
        "O-006",
        "O-007"
      ]
    }
  ],
  "results": {
    "summary_en": "The principal CO2 alert-state behavior was verified end-to-end: initial warning, 30-minute repeated warning, silent clear after sustained low CO2, and a new INITIAL alert after reset.",
    "summary_ja": "CO₂警報の主要な状態遷移をエンドツーエンドで検証した。初回警報、30分再警告、低CO₂継続後の無通知解除、解除後の新しいINITIAL再発報を確認した。",
    "success_level": "FULL",
    "established_claim_refs": [
      "C-001",
      "C-002",
      "C-003",
      "C-004"
    ],
    "unresolved_claim_refs": [],
    "disproven_claim_refs": []
  },
  "conclusion": {
    "en": "The experiment verified the practical CO2 ventilation-alert state machine using SwitchBot CO2 data, Google Apps Script state logic, and LINE Messaging API push delivery. Initial alert delivery, the configured 30-minute repeated warning, the silent reset effect after at least 10 minutes below 900 ppm, and post-reset re-alert as a new INITIAL notification were all observed at runtime. The lifecycle status is therefore COMPLETED. Deliberate missing-data/API-error fault injection was not performed and remains optional additional validation outside the principal success criteria.",
    "ja": "SwitchBot CO₂データ、Google Apps Scriptの状態判定、LINE Messaging API Pushを用いた換気警報状態機械について、初回警報、設定した30分再警告、900 ppm未満10分以上後の無通知解除の効果、解除後の新しいINITIAL再発報をすべて実動で確認した。このためExperiment statusはCOMPLETEDである。欠測・APIエラーの意図的なフォールト試験は実施しておらず、主要成功基準には含めなかった追加検証である。",
    "evidence_basis_refs": [
      "C-001",
      "C-002",
      "C-003",
      "C-004"
    ],
    "remaining_uncertainties": [],
    "recommended_next_actions": [
      "Optional additional validation: if operational robustness needs to be quantified, independently fault-inject missing-data/API-error cases without changing the completed result for the principal alert-state branches."
    ]
  },
  "data_artifacts": [
    {
      "id": "AR-001",
      "type": "legacy_public_record",
      "path": "website/content/ja/experiments/switchbot-co2-line-alert.md",
      "public": true,
      "notes": "Existing bilingual public article is the retained public source record; raw household telemetry and private screenshots are withheld."
    },
    {
      "id": "AR-002",
      "type": "private_runtime_evidence",
      "path": null,
      "public": false,
      "notes": "Private LINE screenshots plus private Google Sheets measurement and execution logs used to verify repeat, reset-effect, and post-reset re-alert behavior. Identifying group information and raw household telemetry are withheld."
    }
  ],
  "sources": [],
  "provenance": {
    "generated_by": "GPT-5.6 Sol assisted reconstruction and verification update from retained experiment/publication records plus user-provided runtime evidence",
    "ai_systems": [
      "GPT-5.6 Sol"
    ],
    "human_roles": [
      "operator",
      "publication approver"
    ],
    "automation_systems": [
      "Google Apps Script",
      "SwitchBot OpenAPI v1.1",
      "LINE Messaging API"
    ],
    "human_editing": "Human supplied experiment observations, deliberately induced qualifying high-CO2 conditions for functional verification, and explicitly authorised publication; private credentials and household identifiers are withheld."
  },
  "publication": {
    "public": true,
    "languages": {
      "en": {
        "published": true,
        "url": "https://ai-experiment-log.pages.dev/en/experiments/switchbot-co2-line-alert/",
        "canonical": false
      },
      "ja": {
        "published": true,
        "url": "https://ai-experiment-log.pages.dev/ja/experiments/switchbot-co2-line-alert/",
        "canonical": false
      }
    },
    "machine_readable_url": "https://ai-experiment-log.pages.dev/data/experiments/AIEL-2026-0004/experiment.json"
  },
  "relationships": [
    {
      "type": "BACKFILLED_FROM",
      "target": "SWITCHBOT-CO2-LINE-ALERT-001"
    },
    {
      "type": "BUILDS_ON",
      "target": "SWITCHBOT-HOME-ENV-001"
    }
  ],
  "revisions": [
    {
      "revision": 1,
      "timestamp": "2026-08-23T08:13:27+09:00",
      "type": "INITIAL_BACKFILL",
      "summary": "Formal AIEL record created from the retained SwitchBot CO2 LINE alert article."
    },
    {
      "revision": 2,
      "timestamp": "2026-08-23T08:20:00+09:00",
      "type": "SCHEMA_NORMALIZATION",
      "summary": "Normalized the retrospective record to AIEL schema and Charter lifecycle/evidence states after CI validation exposed the provisional record format."
    },
    {
      "revision": 3,
      "timestamp": "2026-08-23T08:31:55+09:00",
      "type": "PUBLICATION_REVIEW",
      "summary": "Integrated pre-publication content review passed for the formal EN/JA pages, in-place migration handling, privacy boundary, and dedicated equipment/purchase support page."
    },
    {
      "revision": 4,
      "timestamp": "2026-08-22T23:38:49+00:00",
      "type": "METADATA_UPDATE",
      "summary": "Gitleaks 8.24.3 full-history scan completed without detected leaks in GitHub Actions workflow run 32605769230 immediately before publication finalization; secret_scan_performed set to true."
    },
    {
      "revision": 5,
      "timestamp": "2026-08-22T23:38:49+00:00",
      "type": "PUBLICATION_UPDATE",
      "summary": "After human-approved merge to main, GitHub Actions workflow run 32605769230 directly observed the English page, Japanese page, and machine-readable JSON on Cloudflare Pages production. The JSON returned HTTP 200, matched experiment_id=AIEL-2026-0004, and matched the repository public copy byte-for-byte. Publication metadata was finalized from that observed state."
    },
    {
      "revision": 6,
      "timestamp": "2026-08-23T23:26:51+09:00",
      "type": "CORRECTION",
      "summary": "Corrected result classification after reader review: untested repeat/reset branches remain UNTESTED hypotheses and unresolved questions rather than claims, and the temporary Cloudflare setup workaround remains action/observation history rather than an established claim or Conclusion evidence basis. The VERIFIED initial end-to-end result is unchanged."
    },
    {
      "revision": 7,
      "timestamp": "2026-08-27T10:33:00+09:00",
      "type": "VERIFICATION_UPDATE",
      "summary": "Follow-up runtime verification established the 30-minute repeated warning, sustained-low silent-reset effect, and post-reset re-alert as a new INITIAL notification by cross-checking private LINE observations with private Google Sheets execution and measurement logs. The principal alert-state success criteria are satisfied and lifecycle status is upgraded from PARTIAL to COMPLETED."
    },
    {
      "revision": 8,
      "timestamp": "2026-08-27T12:58:00+09:00",
      "type": "CLASSIFICATION_AND_ENVIRONMENT_CORRECTION",
      "summary": "Separated not-performed additional validation and not-implemented source-management traceability from unresolved experimental problems; removed them from remaining_uncertainties. Also recorded the experiment-used SwitchBot Hub Mini W0202200 in the machine-readable environment and normalized alert wording away from the ambiguous alert-episode phrasing."
    },
    {
      "revision": 9,
      "timestamp": "2026-08-27T14:09:00+09:00",
      "type": "PUBLICATION_SEMANTIC_REVIEW_CORRECTION",
      "summary": "Removed the non-material Apps Script revision-pinning task from public Experiment uncertainty/limitations and retained it as an internal management/traceability concern. Kept missing-data/API-error fault injection explicitly classified as additional validation not performed rather than an unresolved defect."
    },
    {
      "revision": 10,
      "timestamp": "2026-09-02T00:16:04+09:00",
      "type": "PUBLICATION_SEMANTIC_REVIEW_CORRECTION",
      "summary": "Narrowed H-002 wording to remove the unsupported universal 'only after' formulation. The retained Evidence verifies one exact 30-minute INITIAL-to-REPEAT sequence through C-002; it does not establish that every future repeat can occur only after the interval under all runtime conditions."
    }
  ],
  "security": {
    "contains_sensitive_data": true,
    "redactions_applied": true,
    "secret_scan_performed": true,
    "publication_reviewed": true
  }
}