{
  "schemaVersion": 1,
  "generatedAt": "2026-08-19T10:58:22.633Z",
  "statusPath": "runs/2026-07-25/status.json",
  "run": {
    "issueDate": "2026-07-25",
    "timezone": "Asia/Taipei",
    "overallStatus": "partial",
    "sourceMode": "fixture",
    "notionDatabaseUrl": "",
    "notionWeeklyViewUrl": "",
    "ragQueueUrl": "",
    "gptProThreadUrl": "",
    "createdAt": "2026-07-25T06:00:00+08:00"
  },
  "summaries": {
    "automationLog": {
      "ok": true,
      "startedAt": "2026-08-14T12:34:09.777Z",
      "finishedAt": "2026-08-14T12:34:49.483Z",
      "durationMs": 39706,
      "stepCount": 38,
      "failedStep": ""
    },
    "runAndVerify": {
      "ok": true,
      "startedAt": "2026-08-14T12:34:09.718Z",
      "finishedAt": "2026-08-14T12:35:18.598Z",
      "durationMs": 68880,
      "stepCount": 41,
      "failedStep": ""
    },
    "health": {
      "ok": true,
      "generatedAt": "2026-08-19T10:58:02.794Z",
      "counts": {
        "ok": 335,
        "warning": 0,
        "error": 0
      },
      "launchd": {
        "label": "com.ferociyyy.ortho-paper-local-automation",
        "projectPlist": "launchd/com.ferociyyy.ortho-paper-local-automation.plist",
        "installedPlist": "~/Library/LaunchAgents/com.ferociyyy.ortho-paper-local-automation.plist",
        "installed": true,
        "synced": true,
        "serviceLoaded": true,
        "state": "not running",
        "runs": "1",
        "lastExitCode": "0",
        "schedule": "Weekday 5, 06:00",
        "kickstartCommand": "npm --prefix \".\" run launchd:kickstart",
        "installCommand": "npm --prefix \".\" run launchd:install",
        "repairCommand": "npm --prefix \".\" run launchd:repair",
        "statusCommand": "npm --prefix \".\" run launchd:status"
      }
    },
    "readiness": {
      "ready": 11,
      "readyTotal": 11,
      "failedReady": 0,
      "manualItems": 2,
      "externalOff": 1,
      "actionTotal": 41,
      "nextRunAt": "2026-08-19T22:00:00.000Z",
      "environmentOk": true,
      "latestAutomationOk": true,
      "latestRunAndVerifyOk": true
    },
    "freshness": {
      "total": 51,
      "fresh": 42,
      "old": 9,
      "stale": 0,
      "blocked": 0,
      "manifestReports": 47,
      "trackedManifestReports": 47,
      "missingManifestReports": 0
    },
    "reportNavigator": {
      "groups": 8,
      "reports": 47,
      "ready": 47,
      "missing": 0,
      "smokeOk": true,
      "consistencyOk": true,
      "goalCoverage": "17/17",
      "freshness": "42/51"
    },
    "executability": {
      "ok": 48,
      "warning": 0,
      "error": 0
    },
    "goNoGo": {
      "status": "go",
      "label": "GO 12/12",
      "title": "GO：可以交給 launchd / 雙擊入口",
      "detail": "硬門檻全通過；可以等待週四 06:00，或手動雙擊 run-automation.command 驗收。",
      "counts": "12/12 gates passed",
      "passed": 12,
      "failed": 0,
      "total": 12,
      "recover": "無需修復"
    },
    "lock": {
      "active": false,
      "stale": false,
      "label": "free",
      "detail": "目前沒有自動化流程持有 lock",
      "href": "automation-live.html"
    },
    "launchdTest": {
      "ok": true,
      "state": "not running",
      "runs": "1",
      "lastExitCode": "0",
      "generatedAt": "2026-08-19T10:58:19.945Z"
    },
    "manualActions": {
      "total": 2,
      "byPriority": {
        "low": 2
      }
    }
  },
  "noExternalApiMode": {
    "enabled": true,
    "primary": [
      "Codex CLI",
      "local Node scripts",
      "local files",
      "openwiki"
    ],
    "disabledInMainFlow": [
      "LLM API",
      "Notion API",
      "GPT Pro automation",
      "PubMed live API"
    ],
    "optionalManual": [
      "GPT Pro thread",
      "Notion sync",
      "browser journal fetch"
    ],
    "safetyGates": {
      "total": 18,
      "externalTotal": 12,
      "externalErrors": 0,
      "orchestratorTotal": 6,
      "orchestratorErrors": 0,
      "ok": true
    }
  },
  "scripts": {
    "automation:doctor": "node scripts/automation-doctor.mjs",
    "automation:run-and-verify": "node scripts/run-and-verify-local.mjs",
    "automation:preflight": "node scripts/automation-preflight.mjs",
    "freshness:html": "node scripts/generate-freshness-report.mjs",
    "goal:coverage": "node scripts/generate-goal-coverage-report.mjs",
    "report:navigator": "node scripts/generate-report-navigator.mjs",
    "safe:terminal": "node scripts/generate-safe-terminal-report.mjs",
    "consistency:html": "node scripts/generate-consistency-report.mjs",
    "manual:actions": "node scripts/generate-manual-actions.mjs",
    "single:trial": "node scripts/create-single-article-trial.mjs",
    "status:normalize": "node scripts/normalize-status.mjs",
    "gpt:handoff": "node scripts/generate-gpt-pro-handoff.mjs",
    "wiki:update": "node scripts/generate-paper-wiki.mjs update",
    "mega": "node scripts/generate-mega.mjs",
    "workflow": "node scripts/generate-workflow.mjs",
    "report": "node scripts/generate-report.mjs",
    "rag:queue": "node scripts/generate-rag-queue.mjs",
    "check": "node scripts/check-run.mjs"
  },
  "nodes": [
    {
      "id": "safety-gates",
      "title": "Safety Gates",
      "lane": "local",
      "status": "done",
      "description": "先確認 local-only 主流程沒有偷偷呼叫 external、Notion、live browser 或 GPT Pro 自動操作。",
      "actionMode": "由 manifest:check 驗證；失敗時先修正邊界，再執行正式 pipeline",
      "command": "npm run manifest:check",
      "inputs": [
        {
          "path": "automation-manifest.json",
          "exists": true
        },
        {
          "path": "scripts/check-automation-quick.mjs",
          "exists": true
        },
        {
          "path": "scripts/run-local-automation.mjs",
          "exists": true
        },
        {
          "path": "scripts/run-and-verify-local.mjs",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "automation-manifest-check.html",
          "exists": true
        },
        {
          "path": "automation-manifest-check.json",
          "exists": true
        }
      ],
      "notes": [
        "External/manual script gates: 12 checked / 0 errors",
        "Orchestrator gates: 6 checked / 0 errors",
        "這是視覺流程的第一道閘門，不會呼叫外部 API。"
      ]
    },
    {
      "id": "journal-candidates",
      "title": "期刊候選",
      "lane": "optional",
      "status": "manual",
      "description": "從已登入瀏覽器或既有候選檔讀取期刊 issue / TOC。主流程可先使用本地候選檔，不呼叫外部 API。",
      "actionMode": "外部停用：需人工明確執行 live browser fetch",
      "command": "npm run fetch:journals:browser",
      "inputs": [
        {
          "path": "config/journals.json",
          "exists": true
        }
      ],
      "outputs": [],
      "notes": [
        "外部 API 停用",
        "可用 browser/session 或本地 JSON fixture"
      ]
    },
    {
      "id": "single-trial",
      "title": "單篇 Trial",
      "lane": "local",
      "status": "queued",
      "description": "從候選清單自動挑一篇高優先骨科 paper，建立單篇 run folder。",
      "actionMode": "可由 automation:local 自動執行",
      "command": "npm run single:trial -- <journal-candidates.json>",
      "inputs": [],
      "outputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "notes": [
        "Article: Total Hip Arthroplasty Infection Review"
      ]
    },
    {
      "id": "normalize",
      "title": "Status Normalize",
      "lane": "local",
      "status": "done",
      "description": "補齊 schemaVersion、pipeline steps、map sections 與 stages，讓後續產物都吃同一個 status.json。",
      "actionMode": "可手動執行；目前不在 automation:local 主步驟中",
      "command": "npm run status:normalize -- runs/2026-07-25/status.json",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "notes": [
        "status.json 是唯一主狀態來源"
      ]
    },
    {
      "id": "mega",
      "title": "mega.md",
      "lane": "local",
      "status": "done",
      "description": "把全文、PDF text、transcript、metadata 與缺漏狀態合併成單一 markdown。",
      "actionMode": "由 single:trial 自動產生；也可手動重建",
      "command": "npm run mega -- runs/2026-07-25/status.json runs/2026-07-25/mega.md",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/mega.md",
          "exists": true
        }
      ],
      "notes": []
    },
    {
      "id": "report",
      "title": "report.md",
      "lane": "local",
      "status": "done",
      "description": "產生 checker report，列出成功、失敗、需人工與 RAG queue 狀態。",
      "actionMode": "由 single:trial 自動產生；也可手動重建",
      "command": "npm run report -- runs/2026-07-25/status.json runs/2026-07-25/report.md",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/report.md",
          "exists": true
        }
      ],
      "notes": []
    },
    {
      "id": "rag-queue",
      "title": "RAG Queue",
      "lane": "background",
      "status": "queued",
      "description": "產生背景 RAG queue。RAG 不阻塞 10:00 閱讀，PDF 完成後才可進 embedding。",
      "actionMode": "背景 queue；不阻塞閱讀",
      "command": "npm run rag:queue -- runs/2026-07-25/status.json runs/2026-07-25/rag-queue.json",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        },
        {
          "path": "library/pdfs/fixture-tha-pji-review.pdf",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/rag-queue.json",
          "exists": true
        }
      ],
      "notes": [
        "背景佇列，不是即時阻塞步驟"
      ]
    },
    {
      "id": "gpt-handoff",
      "title": "GPT Handoff",
      "lane": "manual",
      "status": "done",
      "description": "產生可貼進 GPT Pro project thread 的 handoff markdown。v1 不自動操作 GPT Pro。",
      "actionMode": "需人工：開啟 handoff 後貼到 GPT Pro",
      "command": "npm run gpt:handoff -- runs/2026-07-25/status.json runs/2026-07-25/gpt-pro-handoff.md",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        },
        {
          "path": "runs/2026-07-25/mega.md",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/gpt-pro-handoff.md",
          "exists": true
        }
      ],
      "notes": [
        "GPT Pro 自動上傳停用",
        "人工或後續 browser automation"
      ]
    },
    {
      "id": "openwiki",
      "title": "OpenWiki",
      "lane": "local",
      "status": "needs_review",
      "description": "用本地 skill 與 deterministic generator 建立論文知識庫，不使用 LLM API。",
      "actionMode": "可由 automation:local 自動更新；needs_review 仍需人工複核",
      "command": "npm run wiki:update -- runs/2026-07-25/status.json",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        },
        {
          "path": "runs/2026-07-25/mega.md",
          "exists": true
        },
        {
          "path": "runs/2026-07-25/gpt-pro-handoff.md",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "openwiki/quickstart.md",
          "exists": true
        }
      ],
      "notes": [
        "Wiki files: 1"
      ]
    },
    {
      "id": "workflow-html",
      "title": "workflow.html",
      "lane": "local",
      "status": "done",
      "description": "產生 paper dashboard，顯示全文、PDF、GPT、RAG、Wiki 等狀態。",
      "actionMode": "可由 automation:local 自動執行",
      "command": "npm run workflow -- runs/2026-07-25/status.json workflow.html",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "runs/2026-07-25/workflow.html",
          "exists": true
        },
        {
          "path": "workflow.html",
          "exists": true
        }
      ],
      "notes": []
    },
    {
      "id": "research-workflow",
      "title": "Research Workflow",
      "lane": "local",
      "status": "done",
      "description": "把累積 paper 轉成文獻矩陣、主題標籤、主題綜整、代表性文獻、文獻回顧草稿與投稿前自審。",
      "actionMode": "本地-only；可由 research:* 指令重建，不寫 Notion、不呼叫 LLM API",
      "command": "npm run research:map -- ortho-literature-review",
      "inputs": [
        {
          "path": "runs/2026-07-25/status.json",
          "exists": true
        },
        {
          "path": "openwiki/quickstart.md",
          "exists": true
        },
        {
          "path": "runs/2026-07-25/gpt-pro-handoff.md",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "research-workflow.html",
          "exists": true
        },
        {
          "path": "research-dashboard.html",
          "exists": true
        },
        {
          "path": "research-workflow.data.json",
          "exists": true
        },
        {
          "path": "research-projects/ortho-literature-review/index.html",
          "exists": true
        }
      ],
      "notes": [
        "第二層研究 workflow：不是取代每週閱讀，而是把閱讀結果整理成研究知識庫。",
        "Claude / GPT Pro 可作人工精讀與潤色，但 v1 不自動操作。"
      ]
    },
    {
      "id": "freshness-coverage",
      "title": "Freshness Coverage",
      "lane": "local",
      "status": "done",
      "description": "追蹤所有正式報表與 manifest artifacts 的新鮮度，避免 dashboard 讀到舊 JSON 或漏追新頁。",
      "actionMode": "由 sync:visuals 自動刷新；失敗時重跑 freshness:html 或 sync:visuals",
      "command": "npm run freshness:html",
      "inputs": [
        {
          "path": "automation-manifest.json",
          "exists": true
        },
        {
          "path": "automation-ui-smoke.json",
          "exists": true
        },
        {
          "path": "automation-report-navigator.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "automation-freshness.html",
          "exists": true
        },
        {
          "path": "automation-freshness.json",
          "exists": true
        }
      ],
      "notes": [
        "42/51 fresh",
        "47/47 manifest reports tracked"
      ]
    },
    {
      "id": "safe-terminal",
      "title": "Safe Terminal",
      "lane": "local",
      "status": "done",
      "description": "產生可從任何 Terminal 位置貼上的安全指令，所有 npm 指令都先 cd 到專案資料夾。",
      "actionMode": "只產生本地 HTML/JSON；不執行外部 API、不修改 Notion、不自動操作 GPT Pro",
      "command": "npm run safe:terminal",
      "inputs": [
        {
          "path": "package.json",
          "exists": true
        },
        {
          "path": "automation-launchd-diagnose.json",
          "exists": true
        },
        {
          "path": "automation-executability.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "automation-safe-terminal.html",
          "exists": true
        },
        {
          "path": "automation-safe-terminal.json",
          "exists": true
        }
      ],
      "notes": [
        "12/12 safe commands",
        "2 anti-patterns documented"
      ]
    },
    {
      "id": "report-navigator",
      "title": "Report Navigator",
      "lane": "local",
      "status": "done",
      "description": "把所有視覺報表依用途分群，並顯示 freshness、goal coverage、consistency 的總結。",
      "actionMode": "由 sync:visuals 自動刷新；用來防止報表越來越多時迷路",
      "command": "npm run report:navigator",
      "inputs": [
        {
          "path": "automation-freshness.json",
          "exists": true
        },
        {
          "path": "automation-goal-coverage.json",
          "exists": true
        },
        {
          "path": "automation-consistency.json",
          "exists": true
        },
        {
          "path": "automation-manifest.json",
          "exists": true
        }
      ],
      "outputs": [
        {
          "path": "automation-report-navigator.html",
          "exists": true
        },
        {
          "path": "automation-report-navigator.json",
          "exists": true
        }
      ],
      "notes": [
        "47/47 reports ready",
        "freshness 42/51"
      ]
    }
  ],
  "edges": [
    [
      "safety-gates",
      "journal-candidates"
    ],
    [
      "journal-candidates",
      "single-trial"
    ],
    [
      "single-trial",
      "normalize"
    ],
    [
      "normalize",
      "mega"
    ],
    [
      "normalize",
      "report"
    ],
    [
      "normalize",
      "rag-queue"
    ],
    [
      "mega",
      "gpt-handoff"
    ],
    [
      "mega",
      "openwiki"
    ],
    [
      "gpt-handoff",
      "openwiki"
    ],
    [
      "openwiki",
      "workflow-html"
    ],
    [
      "report",
      "workflow-html"
    ],
    [
      "rag-queue",
      "workflow-html"
    ],
    [
      "openwiki",
      "research-workflow"
    ],
    [
      "workflow-html",
      "research-workflow"
    ],
    [
      "research-workflow",
      "freshness-coverage"
    ],
    [
      "workflow-html",
      "freshness-coverage"
    ],
    [
      "freshness-coverage",
      "safe-terminal"
    ],
    [
      "safe-terminal",
      "report-navigator"
    ]
  ],
  "operation": {
    "completionPercent": 91,
    "localDone": 10,
    "localTotal": 11,
    "manualCount": 3,
    "executionReady": true,
    "nextActions": [
      "打開 gpt-pro-handoff.md，人工貼到 GPT Pro，回填 clinical guide。",
      "複核 OpenWiki 的 needs_review 欄位與 RAG readiness。"
    ],
    "recommendedActions": [
      {
        "id": "ready-wait-schedule",
        "title": "等待週四 06:00 自動跑",
        "severity": "ok",
        "mode": "view",
        "primaryAction": "打開 automation-schedule.html",
        "description": "2026年8月20日星期四 上午06:00 [GMT+8]；0 天 11 小時 2 分",
        "href": "automation-schedule.html",
        "command": ""
      },
      {
        "id": "ready-open-receipt",
        "title": "看最近一次自動化收據",
        "severity": "ok",
        "mode": "double-click",
        "primaryAction": "雙擊 open-receipt.command",
        "description": "確認最近一次 local pipeline、verify、產出檔、連結檢查與最慢步驟。",
        "href": "open-receipt.command",
        "command": "open \"./open-receipt.command\""
      },
      {
        "id": "manual-queue",
        "title": "10:00 後處理人工待辦",
        "severity": "manual",
        "mode": "manual",
        "primaryAction": "打開 manual-actions.html 逐項處理",
        "description": "2 個人工項目；通常是 GPT Pro handoff、OpenWiki review、RAG clinical review。",
        "href": "manual-actions.html",
        "command": ""
      }
    ],
    "goNoGo": {
      "status": "go",
      "label": "GO 12/12",
      "title": "GO：可以交給 launchd / 雙擊入口",
      "detail": "硬門檻全通過；可以等待週四 06:00，或手動雙擊 run-automation.command 驗收。",
      "counts": "12/12 gates passed",
      "passed": 12,
      "failed": 0,
      "total": 12,
      "recover": "無需修復"
    },
    "hardGates": [
      {
        "id": "gate:lock-free",
        "title": "Automation lock 是 free",
        "ok": true,
        "status": "go",
        "detail": "沒有正在跑或卡住的 automation lock",
        "recover": "open-live-monitor.command"
      },
      {
        "id": "gate:launchd-ready",
        "title": "launchd 已載入且 plist 同步",
        "ok": true,
        "status": "go",
        "detail": "loaded true / synced true",
        "recover": "repair-launchd.command"
      },
      {
        "id": "gate:launchd-test",
        "title": "最近 launchd:test exit 0",
        "ok": true,
        "status": "go",
        "detail": "runs 1 / state not running / exit 0",
        "recover": "install-and-test-launchd.command"
      },
      {
        "id": "gate:run-and-verify",
        "title": "最近 run + verify 成功",
        "ok": true,
        "status": "go",
        "detail": "41 steps passed",
        "recover": "run-automation.command"
      },
      {
        "id": "gate:visual-sync-post-proof",
        "title": "Visual sync post proof 成功",
        "ok": true,
        "status": "go",
        "detail": "2/2 post refresh ok / post:ui-smoke, post:control-center",
        "recover": "automation-visual-sync.html"
      },
      {
        "id": "gate:ui-smoke",
        "title": "UI smoke 全綠",
        "ok": true,
        "status": "go",
        "detail": "723 ok / 0 error",
        "recover": "check-automation.command"
      },
      {
        "id": "gate:freshness",
        "title": "視覺報表不是 stale",
        "ok": true,
        "status": "go",
        "detail": "42/51 fresh / stale 0 / blocked 0",
        "recover": "sync-visuals.command"
      },
      {
        "id": "gate:safety",
        "title": "Safety gates 守住 local-only 邊界",
        "ok": true,
        "status": "go",
        "detail": "261 ok / 0 error",
        "recover": "automation-manifest-check.html"
      },
      {
        "id": "gate:command-runtime",
        "title": "Terminal 指令目錄完整",
        "ok": true,
        "status": "go",
        "detail": "commands 71/71, npm missing 0; safe terminal 12/12, npm missing 0",
        "recover": "automation-safe-terminal.html"
      },
      {
        "id": "gate:links",
        "title": "本地連結沒有斷",
        "ok": true,
        "status": "go",
        "detail": "985 ok / 0 error",
        "recover": "automation-links.html"
      },
      {
        "id": "gate:entrypoints",
        "title": "必要雙擊入口可執行",
        "ok": true,
        "status": "go",
        "detail": "12/12 executable",
        "recover": "automation-entrypoints.html"
      },
      {
        "id": "gate:reports",
        "title": "必要視覺頁存在",
        "ok": true,
        "status": "go",
        "detail": "12/12 reports ready",
        "recover": "sync-visuals.command"
      }
    ],
    "readiness": {
      "ok": true,
      "status": "ready",
      "ready": 11,
      "readyTotal": 11,
      "failedReady": 0,
      "manualItems": 2,
      "externalOff": 1,
      "actionTotal": 41,
      "nextRunAt": "2026-08-19T22:00:00.000Z",
      "nextRunLocal": "2026年8月20日星期四 上午06:00 [GMT+8]",
      "countdown": "0 天 11 小時 2 分",
      "scheduleSource": "Weekday 5, 06:00",
      "nextHumanAction": "本地自動排程已可跑；人工待辦可在 10:00 後處理，不阻塞週四 06:00 local automation。"
    },
    "launchdTest": {
      "ok": true,
      "state": "not running",
      "runs": "1",
      "lastExitCode": "0",
      "generatedAt": "2026-08-19T10:58:19.945Z"
    },
    "terminalCommands": {
      "runAndVerify": "npm --prefix \".\" run automation:run-and-verify",
      "local": "npm --prefix \".\" run automation:local",
      "preflight": "npm --prefix \".\" run automation:preflight",
      "launchdInstall": "npm --prefix \".\" run launchd:install",
      "launchdRepair": "npm --prefix \".\" run launchd:repair",
      "launchdKickstart": "npm --prefix \".\" run launchd:kickstart",
      "launchdTest": "npm --prefix \".\" run launchd:test",
      "liveMonitor": "npm --prefix \".\" run monitor:html",
      "map": "npm --prefix \".\" run automation:map -- runs/2026-07-25/status.json"
    },
    "reportNavigator": {
      "groups": 8,
      "reports": 47,
      "ready": 47,
      "missing": 0,
      "smokeOk": true,
      "consistencyOk": true,
      "goalCoverage": "17/17",
      "freshness": "42/51"
    }
  },
  "runHistory": [
    {
      "id": "2026-08-14T12-34-09-777Z",
      "dir": "runs/automation-history/2026-08-14T12-34-09-777Z",
      "logPath": "runs/automation-history/2026-08-14T12-34-09-777Z/automation-log.json",
      "ok": true,
      "startedAt": "2026-08-14T12:34:09.777Z",
      "finishedAt": "2026-08-14T12:34:49.483Z",
      "durationMs": 39706,
      "statusPath": "runs/2026-07-15/single-one-stage-versus-two-stage-exchange-arthroplasty-for-periprosthe/status.json",
      "stepCount": 38,
      "failedStep": "",
      "stepLinks": [
        {
          "name": "automation:preflight",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T12-34-09-777Z/automation-preflight.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T12-34-09-777Z/automation-preflight.err.log"
        },
        {
          "name": "single:trial",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T12-34-09-777Z/single-trial.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T12-34-09-777Z/single-trial.err.log"
        },
        {
          "name": "wiki:update",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T12-34-09-777Z/wiki-update.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T12-34-09-777Z/wiki-update.err.log"
        }
      ]
    },
    {
      "id": "2026-08-14T11-50-36-740Z",
      "dir": "runs/automation-history/2026-08-14T11-50-36-740Z",
      "logPath": "runs/automation-history/2026-08-14T11-50-36-740Z/automation-log.json",
      "ok": true,
      "startedAt": "2026-08-14T11:50:36.740Z",
      "finishedAt": "2026-08-14T11:50:56.085Z",
      "durationMs": 19345,
      "statusPath": "runs/2026-07-15/single-one-stage-versus-two-stage-exchange-arthroplasty-for-periprosthe/status.json",
      "stepCount": 38,
      "failedStep": "",
      "stepLinks": [
        {
          "name": "automation:preflight",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T11-50-36-740Z/automation-preflight.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T11-50-36-740Z/automation-preflight.err.log"
        },
        {
          "name": "single:trial",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T11-50-36-740Z/single-trial.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T11-50-36-740Z/single-trial.err.log"
        },
        {
          "name": "wiki:update",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T11-50-36-740Z/wiki-update.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T11-50-36-740Z/wiki-update.err.log"
        }
      ]
    },
    {
      "id": "2026-08-14T08-32-39-104Z",
      "dir": "runs/automation-history/2026-08-14T08-32-39-104Z",
      "logPath": "runs/automation-history/2026-08-14T08-32-39-104Z/automation-log.json",
      "ok": true,
      "startedAt": "2026-08-14T08:32:39.104Z",
      "finishedAt": "2026-08-14T08:32:55.618Z",
      "durationMs": 16514,
      "statusPath": "runs/2026-07-15/single-one-stage-versus-two-stage-exchange-arthroplasty-for-periprosthe/status.json",
      "stepCount": 38,
      "failedStep": "",
      "stepLinks": [
        {
          "name": "automation:preflight",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-32-39-104Z/automation-preflight.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-32-39-104Z/automation-preflight.err.log"
        },
        {
          "name": "single:trial",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-32-39-104Z/single-trial.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-32-39-104Z/single-trial.err.log"
        },
        {
          "name": "wiki:update",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-32-39-104Z/wiki-update.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-32-39-104Z/wiki-update.err.log"
        }
      ]
    },
    {
      "id": "2026-08-14T08-23-29-796Z",
      "dir": "runs/automation-history/2026-08-14T08-23-29-796Z",
      "logPath": "runs/automation-history/2026-08-14T08-23-29-796Z/automation-log.json",
      "ok": true,
      "startedAt": "2026-08-14T08:23:29.796Z",
      "finishedAt": "2026-08-14T08:23:52.542Z",
      "durationMs": 22746,
      "statusPath": "runs/2026-07-15/single-one-stage-versus-two-stage-exchange-arthroplasty-for-periprosthe/status.json",
      "stepCount": 38,
      "failedStep": "",
      "stepLinks": [
        {
          "name": "automation:preflight",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-23-29-796Z/automation-preflight.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-23-29-796Z/automation-preflight.err.log"
        },
        {
          "name": "single:trial",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-23-29-796Z/single-trial.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-23-29-796Z/single-trial.err.log"
        },
        {
          "name": "wiki:update",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T08-23-29-796Z/wiki-update.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T08-23-29-796Z/wiki-update.err.log"
        }
      ]
    },
    {
      "id": "2026-08-14T07-48-45-060Z",
      "dir": "runs/automation-history/2026-08-14T07-48-45-060Z",
      "logPath": "runs/automation-history/2026-08-14T07-48-45-060Z/automation-log.json",
      "ok": true,
      "startedAt": "2026-08-14T07:48:45.060Z",
      "finishedAt": "2026-08-14T07:49:01.174Z",
      "durationMs": 16114,
      "statusPath": "runs/2026-07-15/single-one-stage-versus-two-stage-exchange-arthroplasty-for-periprosthe/status.json",
      "stepCount": 38,
      "failedStep": "",
      "stepLinks": [
        {
          "name": "automation:preflight",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T07-48-45-060Z/automation-preflight.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T07-48-45-060Z/automation-preflight.err.log"
        },
        {
          "name": "single:trial",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T07-48-45-060Z/single-trial.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T07-48-45-060Z/single-trial.err.log"
        },
        {
          "name": "wiki:update",
          "ok": true,
          "stdoutLog": "runs/automation-history/2026-08-14T07-48-45-060Z/wiki-update.out.log",
          "stderrLog": "runs/automation-history/2026-08-14T07-48-45-060Z/wiki-update.err.log"
        }
      ]
    }
  ]
}
