{
  "generatedAt": "2026-08-29T12:55:57+08:00",
  "site": "https://harmonica.observe.tw",
  "overall": {
    "status": "degraded",
    "label": "部分異常",
    "summary": "核心 pipeline 有產出；需要注意：Instagram RSSHub。 Facebook Apify 目前依排程或預算節流。"
  },
  "metrics": {
    "updates": 3552,
    "updatesWindowDays": 30,
    "directoryEntries": 319,
    "watchSources": 787,
    "currentErrors": 39,
    "latestDataAt": "2026-08-29T12:55:33+08:00",
    "latestSocialObservationAt": "2026-08-29T12:54:55+08:00"
  },
  "watchSources": {
    "platforms": {
      "facebook": 163,
      "instagram": 356,
      "threads": 28,
      "website": 88,
      "x": 12,
      "youtube": 140
    },
    "types": {
      "facebook_page_posts": 163,
      "rss": 40,
      "rsshub_instagram_profile": 178,
      "rsshub_instagram_story": 178,
      "webpage_watch": 88,
      "youtube_ytdlp": 140
    },
    "platformRows": [
      {
        "platform": "facebook",
        "sources": 163,
        "currentErrors": 0,
        "status": "ok"
      },
      {
        "platform": "instagram",
        "sources": 356,
        "currentErrors": 39,
        "status": "degraded"
      },
      {
        "platform": "threads",
        "sources": 28,
        "currentErrors": 0,
        "status": "ok"
      },
      {
        "platform": "website",
        "sources": 88,
        "currentErrors": 0,
        "status": "ok"
      },
      {
        "platform": "x",
        "sources": 12,
        "currentErrors": 0,
        "status": "ok"
      },
      {
        "platform": "youtube",
        "sources": 140,
        "currentErrors": 0,
        "status": "ok"
      }
    ]
  },
  "components": [
    {
      "id": "pipeline",
      "name": "主排程與輸出",
      "status": "ok",
      "label": "正常",
      "summary": "定期 pipeline 已產生公開資料快照。",
      "details": [
        "最新公開資料：2026-08-29 12:55:33",
        "pipeline.log 更新：2026-07-12 02:58:29",
        "pipeline.err.log 更新：2026-07-11 14:33:03",
        "LaunchAgent：running，last exit 0"
      ]
    },
    {
      "id": "public-api",
      "name": "公開 API",
      "status": "ok",
      "label": "正常",
      "summary": "latest.json 有 3552 筆更新，sources.json 有 319 筆公開目錄。",
      "details": [
        "更新視窗：30 天",
        "watch sources：787"
      ]
    },
    {
      "id": "rsshub",
      "name": "RSSHub 服務",
      "status": "ok",
      "label": "正常",
      "summary": "本機 RSSHub 入口回 200。",
      "details": [
        "HTTP：200",
        "耗時：72 ms"
      ]
    },
    {
      "id": "instagram",
      "name": "Instagram RSSHub",
      "status": "degraded",
      "label": "部分異常",
      "summary": "356 個 Instagram 來源（profile 178、story 178）；最新抓取批次目前 39 個錯誤。",
      "details": [
        "最新社群觀測：2026-08-29 12:54:55",
        "story 無公開內容/空路由略過：0",
        "IG 節流：profile 每 12 小時、story 每 12 小時；來源間隔 8 秒、每輪最多 40 個。",
        "本輪 IG：抓取 15、排程略過 341、延後 0、錯誤 6。",
        "下一個 IG 來源：約 2026-08-29 12:58:30"
      ]
    },
    {
      "id": "x-twitter",
      "name": "X / Twitter RSS",
      "status": "ok",
      "label": "正常",
      "summary": "12 個 X 來源；最新抓取批次目前 0 個錯誤。",
      "details": [
        "目前 route 依 RSSHub 設定抓取。",
        "若持續 503，通常要檢查 RSSHub 的 Twitter API 設定。"
      ]
    },
    {
      "id": "facebook-apify",
      "name": "Facebook Apify",
      "status": "paused",
      "label": "節流中",
      "summary": "163 個 Facebook 來源。 目前依預算 pacing 暫停開 run，等待 due 來源累積。",
      "details": [
        "最近成功 run：2026-08-28 12:17:13",
        "最近新增 inbox：0",
        "due sources：6",
        "selected this check：0",
        "min sources per run：8",
        "遠端月額度剩餘：$1.36",
        "規劃單次預算：$0.08"
      ]
    },
    {
      "id": "youtube",
      "name": "YouTube yt-dlp",
      "status": "ok",
      "label": "正常",
      "summary": "140 個 YouTube 來源；最近 run error_count=0。",
      "details": [
        "最近完成：2026-08-29 12:48:06",
        "最近新增 inbox：0"
      ]
    },
    {
      "id": "other-rss",
      "name": "Threads / 其他 RSS",
      "status": "ok",
      "label": "正常",
      "summary": "28 個 Threads 來源；其他 RSS 最新抓取批次目前 0 個錯誤。",
      "details": [
        "RSS 類型來源：40"
      ]
    }
  ],
  "recentErrors": [
    {
      "seenAt": "2026-08-29T02:12:18+08:00",
      "sourceId": "ig_hsinchucounty_culture",
      "sourceName": "新竹縣文化局",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:18:27+08:00",
      "sourceId": "ig_into_be_om",
      "sourceName": "張錫範",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T03:19:49+08:00",
      "sourceId": "ig_kshs_harmonica",
      "sourceName": "KSHS Harmonica",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:11:50+08:00",
      "sourceId": "ig_marcoscollgonzalez",
      "sourceName": "Marcos Coll",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T05:07:47+08:00",
      "sourceId": "ig_minnie_o6i8",
      "sourceName": "蔡明勳",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 8 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T03:23:53+08:00",
      "sourceId": "ig_ncku_harmonicaclub",
      "sourceName": "成大口琴社",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:13:21+08:00",
      "sourceId": "ig_ntch_taipei",
      "sourceName": "國家兩廳院",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:41:40+08:00",
      "sourceId": "ig_nthu_harmonica_club",
      "sourceName": "NTHU Harmonica Club",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:46:54+08:00",
      "sourceId": "ig_orquestraharmonicas",
      "sourceName": "庫里奇巴口琴樂團",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T05:15:59+08:00",
      "sourceId": "ig_sabrinachen820",
      "sourceName": "陳若芸",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 8 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T06:54:30+08:00",
      "sourceId": "ig_springharpfest",
      "sourceName": "Spring Harp Fest",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 76 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:42:45+08:00",
      "sourceId": "ig_theduet_music",
      "sourceName": "The Duet 獨特音樂",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:17:45+08:00",
      "sourceId": "ig_triple_f_harmonica",
      "sourceName": "飛飛飛 Triple F",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T04:00:04+08:00",
      "sourceId": "ig_velozharmonica",
      "sourceName": "Veloz Harmonica Quartet",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 50 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:12:50+08:00",
      "sourceId": "ig_weiwuying_centerforthearts",
      "sourceName": "衛武營國家藝術文化中心",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:52:27+08:00",
      "sourceId": "ig_whf_world_harmonica_festival",
      "sourceName": "World Harmonica Festival",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:15:56+08:00",
      "sourceId": "ig_xdgaste",
      "sourceName": "邴國榮",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T03:21:39+08:00",
      "sourceId": "ig_yellowstone_music_shop",
      "sourceName": "黃石樂器",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T02:44:35+08:00",
      "sourceId": "ig_yora",
      "sourceName": "陳瑤容 Yora Chen",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 2 次：The read operation timed out"
    },
    {
      "seenAt": "2026-08-29T04:04:19+08:00",
      "sourceId": "ig_yotambo1",
      "sourceName": "Yotam Ben-Or",
      "platform": "instagram",
      "sourceType": "rsshub_instagram_profile",
      "error": "連續失敗 3 次：The read operation timed out"
    }
  ],
  "runtime": {
    "pipeline": {
      "currentStep": "build status page",
      "heartbeatAt": "2026-08-29T04:55:57.426708+00:00",
      "lockFile": "/Users/skyhong/Documents/Harmonica-in-Taiwan/state/run_pipeline.lock",
      "maxPostAgeDays": 30,
      "message": "",
      "pid": 46682,
      "startedAt": "2026-08-29T04:48:01.113843+00:00",
      "status": "running",
      "steps": [
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_social_sources.py"
          ],
          "finishedAt": "2026-08-29T04:48:01.253472+00:00",
          "name": "build social sources",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:48:01.115530+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/youtube_ytdlp_fetcher.py",
            "--max-post-age-days",
            "30"
          ],
          "finishedAt": "2026-08-29T04:48:07.002275+00:00",
          "name": "fetch youtube",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:48:01.254170+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/apify_facebook_fetcher.py",
            "--days-back",
            "30",
            "--local-max-post-age-days",
            "30",
            "--run"
          ],
          "finishedAt": "2026-08-29T04:48:08.250156+00:00",
          "name": "fetch facebook apify",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:48:07.003050+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/social_feed_watchdog.py",
            "--max-post-age-days",
            "30",
            "--request-timeout",
            "10"
          ],
          "finishedAt": "2026-08-29T04:54:55.243465+00:00",
          "name": "watch social feeds",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:48:08.253193+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_public_data.py"
          ],
          "finishedAt": "2026-08-29T04:54:58.057391+00:00",
          "name": "build public data",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:54:55.244429+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/backfill_public_source_pages.py",
            "--skip-fetch"
          ],
          "finishedAt": "2026-08-29T04:55:02.844146+00:00",
          "name": "backfill source pages",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:54:58.058846+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_public_data.py"
          ],
          "finishedAt": "2026-08-29T04:55:05.557291+00:00",
          "name": "rebuild public data",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:02.845059+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_score_publications.py"
          ],
          "finishedAt": "2026-08-29T04:55:05.693633+00:00",
          "name": "build score publications",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:05.557961+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_score_sources.py"
          ],
          "finishedAt": "2026-08-29T04:55:05.752711+00:00",
          "name": "build score sources",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:05.694355+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/generate_rss_feeds.py"
          ],
          "finishedAt": "2026-08-29T04:55:36.718978+00:00",
          "name": "generate rss feeds",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:05.753305+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_public_calendar_events.py"
          ],
          "finishedAt": "2026-08-29T04:55:37.551599+00:00",
          "name": "build public calendar events",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:36.720348+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/apply_submitted_events.py"
          ],
          "finishedAt": "2026-08-29T04:55:37.634668+00:00",
          "name": "apply submitted events",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:37.553265+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Users/skyhong/.hermes/google-workspace-venv/bin/python",
            "scripts/sync_google_calendar_events.py"
          ],
          "finishedAt": "2026-08-29T04:55:57.424479+00:00",
          "name": "sync google calendar",
          "returnCode": 0,
          "startedAt": "2026-08-29T04:55:37.635244+00:00",
          "status": "ok"
        },
        {
          "command": [
            "/Library/Developer/CommandLineTools/usr/bin/python3",
            "scripts/build_status_page.py"
          ],
          "finishedAt": "",
          "name": "build status page",
          "returnCode": null,
          "startedAt": "2026-08-29T04:55:57.426673+00:00",
          "status": "running"
        }
      ],
      "version": 1
    },
    "socialFetch": {
      "currentSource": {},
      "errors": 8,
      "fetchedPosts": 2223,
      "finishedAt": "2026-08-29T04:54:55.165238+00:00",
      "heartbeatAt": "2026-08-29T04:54:55.165235+00:00",
      "instagram": {
        "attempted": 15,
        "deferred": 0,
        "delay_secs": 8.0,
        "errors": 6,
        "max_attempts_per_run": 40,
        "profile_attempted": 6,
        "profile_deferred": 0,
        "profile_interval_hours": 12.0,
        "profile_skipped": 172,
        "scheduled": 341,
        "skipped": 341,
        "story_attempted": 9,
        "story_deferred": 0,
        "story_interval_hours": 12.0,
        "story_skipped": 169
      },
      "llmTags": {
        "cached": 0,
        "enabled": true,
        "errors": 0,
        "requests": 0
      },
      "message": "",
      "newRelevantPosts": 0,
      "phase": "complete",
      "pid": 46729,
      "processedSources": 788,
      "skippedOldPosts": 0,
      "startedAt": "2026-08-29T04:48:08.375567+00:00",
      "status": "ok",
      "totalSources": 788,
      "version": 1
    }
  }
}
