{
  "name": "Warconomy automation readiness",
  "asOf": "2026-06-05",
  "note": "Safe ways to reduce manual work without unsafe auto-promotion. Automation may detect and report (availability, completeness, health) but never fetches-and-promotes a value, runs a scheduled job, or stands up a runtime service. No numeric values appear here.",
  "page": "https://warconomy.com/operator/automation",
  "implementedCount": 6,
  "designOnlyCount": 4,
  "opportunities": [
    {
      "id": "commodity-history-refresh",
      "title": "Commodity-history refresh (FAO + World Bank)",
      "kind": "implemented",
      "whatItDoes": "Two on-demand commands machine-read official free files into committed snapshots the site reads statically: `npm run commodities:ingest` (FAO Food Price Index CSV) and `npm run commodities:ingest:worldbank` (World Bank Pink Sheet XLSX — oil, gas, wheat, maize, rice, fertilizer price levels).",
      "safeBecause": "Both read free, official, public files — no API key, no paid API, no scraping of chart-only values. The World Bank XLSX is read with a small pure-Node unzip (no third-party dependency). Hand-curated conflict observations are untouched; no causation is asserted.",
      "reducesManualWork": "Turns previously PDF/XLSX/manual commodity updates into two one-command, reviewable refreshes — the first genuinely automatable sources.",
      "surface": "scripts/commodities-ingest*.mjs + /commodities/history + /methodology/commodity-prices."
    },
    {
      "id": "commodity-refresh-currency",
      "title": "Commodity refresh-currency watch",
      "kind": "implemented",
      "whatItDoes": "On-demand `npm run commodities:check-refresh` compares the official FAO and World Bank files to the committed snapshots and flags 'possible-new-release' when a newer period/workbook appears available.",
      "safeBecause": "Detect-only: it reads only the official files' latest period / 'updated on' date, writes no snapshot, ingests nothing, and promotes no value. Network-only and not part of the build/validation.",
      "reducesManualWork": "Supports 'build it and forget it, but check occasionally' — you only re-run an ingest when the watch says a source moved.",
      "surface": "scripts/commodities-check-refresh.mjs + /operator/source-watch + the operator report."
    },
    {
      "id": "packet-completeness",
      "title": "Source-packet completeness checker",
      "kind": "implemented",
      "whatItDoes": "A pure function validates that a maintainer-supplied packet has every required field (official URL, publisher, value, unit, period/asOf, where found, caveat, confidence) and reports what's missing.",
      "safeBecause": "It validates a packet's shape only — it never fetches, infers, or promotes a value.",
      "reducesManualWork": "Catches an incomplete packet before any dataset edit, so a promotion attempt never half-lands.",
      "surface": "validatePacket() in src/lib/packet-validator.ts + its test."
    },
    {
      "id": "operator-consistency",
      "title": "Operator / data-needs consistency audit",
      "kind": "implemented",
      "whatItDoes": "Tests assert every workbench item has a next action and a source packet, every future item is marked not-implemented, and every blocked item states why it can't be finished alone.",
      "safeBecause": "Build-time assertions over existing records; no data is changed.",
      "reducesManualWork": "Keeps the operator surfaces trustworthy as items change, so nothing silently goes stale.",
      "surface": "operator-consistency test + the operator workbench."
    },
    {
      "id": "stale-reminder",
      "title": "Stale-data reminders (build-time)",
      "kind": "implemented",
      "whatItDoes": "Freshness/review status is computed against each source's cadence and surfaced (current / due-soon / overdue / stale) on the data-review and coverage surfaces.",
      "safeBecause": "Deterministic against the curated reference date; no runtime clock, no fetching.",
      "reducesManualWork": "Tells the maintainer exactly which values to re-check first.",
      "surface": "/data-review, /data-coverage, /freshness."
    },
    {
      "id": "promotion-dry-run",
      "title": "Promotion dry-run generator",
      "kind": "implemented",
      "whatItDoes": "Shows what a promotion would change before it is made, so a value edit is reviewed up front.",
      "safeBecause": "A preview only — it does not write anything.",
      "reducesManualWork": "Removes guesswork from a manual promotion.",
      "surface": "/methodology/promotion-dry-run."
    },
    {
      "id": "release-availability-watcher",
      "title": "Source-release availability watcher",
      "kind": "design-only",
      "whatItDoes": "A future helper could check whether an official source page advertises a NEWER release than the one on file and emit a 'candidate available' flag — with no value attached.",
      "safeBecause": "Availability-only: it would never read, infer, or promote a value, and would not run as a scheduled job on the server. It would be a local/CLI check the maintainer runs.",
      "reducesManualWork": "Saves the maintainer from manually polling each source for a new release.",
      "surface": "Design note here; NOT implemented (the static rules exclude server-side fetching/jobs by default)."
    },
    {
      "id": "url-health-checklist",
      "title": "Official source-URL health checklist",
      "kind": "design-only",
      "whatItDoes": "A manual or local-only pass that flags dead/redirected official source URLs before they undermine a citation.",
      "safeBecause": "No crawling from the deployed site; a maintainer-run check only.",
      "reducesManualWork": "Catches link rot proactively instead of via reader reports.",
      "surface": "Design note here + /source-health; NOT a runtime crawler."
    },
    {
      "id": "indexing-status-tracker",
      "title": "Indexing checklist status tracker",
      "kind": "design-only",
      "whatItDoes": "A static checklist the maintainer ticks off (GSC property, DNS TXT, sitemap submitted, top pages requested) so indexing setup state is visible.",
      "safeBecause": "A checklist — Claude never submits anything to a search engine.",
      "reducesManualWork": "Keeps the one-time manual indexing steps from being forgotten or repeated.",
      "surface": "/methodology/indexing."
    },
    {
      "id": "provider-evaluation-checklist",
      "title": "Future API/provider evaluation checklist",
      "kind": "design-only",
      "whatItDoes": "Records an assessment of a possible future AIS/market-data provider (terms, cost, reuse rights) so a decision is deliberate.",
      "safeBecause": "Assesses a provider; ingests nothing. No vendor claims without cited terms.",
      "reducesManualWork": "Front-loads the decision so live-data work, if ever chosen, starts from a record.",
      "surface": "/operator/source-packets (evaluation packets), /methodology/maritime-data, /methodology/live-data."
    }
  ],
  "guardrails": [
    "No fetch-and-promote: a value is only added by a maintainer-reviewed manual transcription.",
    "No scheduled jobs, background workers, or runtime services on the server.",
    "No scraping of unofficial data and no parsing of binary PDF/XLSX into the dataset.",
    "No paid APIs and no live feeds.",
    "Automation may detect and report availability/health only — it never asserts a number."
  ],
  "backlog": "https://warconomy.com/operator/backlog"
}