{
  "schema_version": "dependency_drift_check_plan_v1",
  "generated_at": "2026-06-04T20:52:25+08:00",
  "program_status": {
    "overall_completion_percent": 99,
    "current_priority": "P1",
    "current_task_id": "P1-205",
    "next_task_id": "P1-206",
    "read_only_mode": true
  },
  "source_refs": [
    "docs/evaluations/package_supply_chain_inventory_2026-06-04.json",
    "docs/evaluations/javascript_package_inventory_2026-06-04.json",
    "docs/evaluations/docker_build_surface_inventory_2026-06-04.json",
    "docs/evaluations/dependency_risk_policy_2026-06-04.json",
    "docs/evaluations/agent_market_governance_snapshot_2026-06-04.json",
    "docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md",
    "docs/HARD_RULES.md"
  ],
  "rollups": {
    "total_cadence_items": 5,
    "total_local_checks": 5,
    "total_external_source_candidates": 10,
    "by_domain": {
      "python": 2,
      "javascript": 3,
      "docker": 3,
      "policy": 1,
      "cve": 2,
      "license": 2,
      "agent_market": 4,
      "external_sources": 2,
      "approval_package": 1
    },
    "read_only_local_check_ids": [
      "python_manifest_drift_local_check",
      "javascript_lockfile_drift_local_check",
      "dockerfile_surface_drift_local_check",
      "dependency_policy_consistency_local_check",
      "agent_market_snapshot_freshness_local_check"
    ],
    "approval_required_source_ids": [
      "osv_advisory_candidate",
      "github_advisory_candidate",
      "pypi_registry_candidate",
      "npm_registry_candidate",
      "docker_hub_manifest_candidate",
      "ghcr_manifest_candidate",
      "package_license_metadata_candidate",
      "deps_dev_license_candidate",
      "agent_official_release_candidate",
      "agent_benchmark_signal_candidate"
    ],
    "design_only_cadence_ids": [
      "daily_repo_drift_readonly",
      "weekly_external_source_review",
      "weekly_agent_market_watch_review",
      "monthly_upgrade_approval_batch",
      "failure_only_notification_review"
    ]
  },
  "cadence_policy": {
    "timezone": "Asia/Taipei",
    "items": [
      {
        "cadence_id": "daily_repo_drift_readonly",
        "domain": "javascript",
        "frequency": "daily design; activation requires P1-206 approval package or operator approval",
        "activation_status": "design_only",
        "owner_agent": "hermes",
        "allowed_now": [
          "read committed JSON snapshots",
          "compare repo manifests and lockfiles",
          "emit read-only drift report design"
        ],
        "blocked_now": [
          "pnpm install",
          "npm audit",
          "package upgrade",
          "lockfile write",
          "workflow activation"
        ],
        "planned_output": "future docs/evaluations/dependency_drift_run_YYYY-MM-DD.json",
        "failure_notification": "failure-only AwoooP / Telegram event after schedule is explicitly approved"
      },
      {
        "cadence_id": "weekly_external_source_review",
        "domain": "external_sources",
        "frequency": "weekly design; external calls blocked until source approval",
        "activation_status": "blocked_until_approval",
        "owner_agent": "openclaw",
        "allowed_now": [
          "source list review",
          "cost and rate-limit analysis",
          "approval package preparation"
        ],
        "blocked_now": [
          "external CVE lookup",
          "external license lookup",
          "registry freshness lookup",
          "paid API call"
        ],
        "planned_output": "future external-source approval package",
        "failure_notification": "only notify when approved source health check fails or data staleness exceeds threshold"
      },
      {
        "cadence_id": "weekly_agent_market_watch_review",
        "domain": "agent_market",
        "frequency": "weekly design; market lookup remains approval-bound",
        "activation_status": "blocked_until_approval",
        "owner_agent": "nemotron",
        "allowed_now": [
          "read existing agent-market snapshots",
          "offline comparison against committed evidence",
          "prepare source approval package"
        ],
        "blocked_now": [
          "SDK installation",
          "paid API call",
          "shadow/canary",
          "production routing",
          "unapproved external market lookup"
        ],
        "planned_output": "future agent-market watch source approval package",
        "failure_notification": "failure-only AwoooP / Telegram event after approved cadence is active"
      },
      {
        "cadence_id": "monthly_upgrade_approval_batch",
        "domain": "approval_package",
        "frequency": "monthly design; package generation only after P1-206",
        "activation_status": "design_only",
        "owner_agent": "openclaw",
        "allowed_now": [
          "define approval package fields",
          "map dependency risk rules to upgrade candidates"
        ],
        "blocked_now": [
          "package upgrade",
          "lockfile write",
          "docker build",
          "image rebuild",
          "registry push"
        ],
        "planned_output": "future P1-206 approval package template",
        "failure_notification": "operator review only when a high/critical candidate cannot be triaged"
      },
      {
        "cadence_id": "failure_only_notification_review",
        "domain": "external_sources",
        "frequency": "each approved scheduled run",
        "activation_status": "design_only",
        "owner_agent": "hermes",
        "allowed_now": [
          "document notification contract",
          "define success suppression and failure escalation"
        ],
        "blocked_now": [
          "Telegram routing change",
          "Alertmanager rule change",
          "workflow activation"
        ],
        "planned_output": "future notification contract for scheduled drift checks",
        "failure_notification": "success stays quiet; failed run, stale source, rate-limit exhaustion, or schema mismatch notifies AwoooP / Telegram"
      }
    ]
  },
  "local_check_plan": [
    {
      "check_id": "python_manifest_drift_local_check",
      "domain": "python",
      "status": "read_only_design",
      "owner_agent": "hermes",
      "frequency": "daily or pre-merge after approval",
      "input_refs": [
        "apps/api/pyproject.toml",
        "apps/api/requirements.txt",
        "packages/lewooogo-data/pyproject.toml",
        "packages/lewooogo-brain/pyproject.toml",
        "docs/evaluations/package_supply_chain_inventory_2026-06-04.json"
      ],
      "planned_output": "python manifest drift report; no requirements rewrite",
      "allowed_now": [
        "read manifests",
        "compare committed dependency specifiers",
        "flag authority drift"
      ],
      "blocked_now": [
        "pip install",
        "uv sync",
        "requirements delete",
        "lockfile write",
        "docker build"
      ],
      "acceptance_criteria": [
        "reports pyproject / requirements drift without modifying either file",
        "maps drift to P1-204 severity rules",
        "emits approval package requirement for any remediation"
      ]
    },
    {
      "check_id": "javascript_lockfile_drift_local_check",
      "domain": "javascript",
      "status": "read_only_design",
      "owner_agent": "hermes",
      "frequency": "daily or pre-merge after approval",
      "input_refs": [
        "package.json",
        "apps/web/package.json",
        "packages/shared-types/package.json",
        "pnpm-lock.yaml",
        "docs/evaluations/javascript_package_inventory_2026-06-04.json"
      ],
      "planned_output": "pnpm importer specifier drift report; no pnpm install",
      "allowed_now": [
        "read package manifests",
        "read pnpm-lock.yaml",
        "compare importer specifiers"
      ],
      "blocked_now": [
        "pnpm install",
        "pnpm update",
        "npm audit",
        "lockfile write",
        "package publish"
      ],
      "acceptance_criteria": [
        "reports missing/mismatch/extra dependencies",
        "keeps lockfile untouched",
        "flags shared-types publish boundary for approval package"
      ]
    },
    {
      "check_id": "dockerfile_surface_drift_local_check",
      "domain": "docker",
      "status": "read_only_design",
      "owner_agent": "hermes",
      "frequency": "weekly or Dockerfile-change after approval",
      "input_refs": [
        "apps/api/Dockerfile",
        "apps/web/Dockerfile",
        "docs/evaluations/docker_build_surface_inventory_2026-06-04.json"
      ],
      "planned_output": "Dockerfile surface drift report; no build or pull",
      "allowed_now": [
        "read Dockerfiles",
        "compare FROM and COPY --from references",
        "compare build-time network fetch patterns"
      ],
      "blocked_now": [
        "docker build",
        "image pull",
        "image rebuild",
        "registry push",
        "production routing"
      ],
      "acceptance_criteria": [
        "reports base image, digest pin, binary source, network fetch, and healthcheck drift",
        "does not contact registries",
        "maps remediation to P1-206 approval package"
      ]
    },
    {
      "check_id": "dependency_policy_consistency_local_check",
      "domain": "policy",
      "status": "read_only_design",
      "owner_agent": "openclaw",
      "frequency": "weekly after approval",
      "input_refs": [
        "docs/evaluations/package_supply_chain_inventory_2026-06-04.json",
        "docs/evaluations/dependency_risk_policy_2026-06-04.json",
        "docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
      ],
      "planned_output": "policy consistency report for severity rules and next actions",
      "allowed_now": [
        "read committed policies",
        "validate rollups",
        "detect stale next_action references"
      ],
      "blocked_now": [
        "policy override",
        "approval bypass",
        "production change"
      ],
      "acceptance_criteria": [
        "catches stale P1 task references",
        "keeps operation_boundaries false",
        "requires OpenClaw/HITL for any gate change"
      ]
    },
    {
      "check_id": "agent_market_snapshot_freshness_local_check",
      "domain": "agent_market",
      "status": "read_only_design",
      "owner_agent": "nemotron",
      "frequency": "weekly after approval",
      "input_refs": [
        "docs/evaluations/agent_market_governance_snapshot_2026-06-04.json",
        "docs/ai/agent-market-watch-sources.v1.json",
        "docs/runbooks/OPENCLAW-REPLACEMENT-EVALUATION.md"
      ],
      "planned_output": "agent-market freshness report using committed snapshots only",
      "allowed_now": [
        "read committed market governance snapshots",
        "compare stale source timestamps",
        "prepare source approval package"
      ],
      "blocked_now": [
        "unapproved external market lookup",
        "SDK installation",
        "paid API call",
        "shadow/canary",
        "production routing"
      ],
      "acceptance_criteria": [
        "keeps Nemotron at offline expert role until replay evidence improves",
        "detects stale market evidence without claiming current market truth",
        "routes replacement questions to OpenClaw/HITL approval boundaries"
      ]
    }
  ],
  "external_source_candidates": [
    {
      "source_id": "osv_advisory_candidate",
      "domain": "cve",
      "source_type": "public vulnerability advisory API candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "free_public_candidate",
      "rate_limit_risk": "medium",
      "cache_policy": "cache advisory responses per package/version for at least 24h after approval",
      "data_retention_policy": "store only package, version, advisory id, severity, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only vulnerability lookup",
        "severity mapping to dependency_risk_policy_v1"
      ],
      "blocked_now": [
        "external CVE lookup",
        "automated remediation",
        "package upgrade"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "docs/evaluations/dependency_risk_policy_2026-06-04.json"
      ]
    },
    {
      "source_id": "github_advisory_candidate",
      "domain": "cve",
      "source_type": "advisory database candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "unknown_until_review",
      "rate_limit_risk": "medium",
      "cache_policy": "cache advisory ids and affected ranges; avoid repeated queries",
      "data_retention_policy": "store minimal advisory metadata and source timestamp",
      "permitted_after_approval": [
        "cross-check high and critical advisories"
      ],
      "blocked_now": [
        "external advisory lookup",
        "paid API call",
        "package upgrade"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "docs/evaluations/dependency_risk_policy_2026-06-04.json"
      ]
    },
    {
      "source_id": "pypi_registry_candidate",
      "domain": "python_registry",
      "source_type": "Python package registry freshness candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "free_public_candidate",
      "rate_limit_risk": "medium",
      "cache_policy": "cache package release metadata per package for 24h after approval",
      "data_retention_policy": "store package name, current specifier, latest seen version, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only version freshness comparison"
      ],
      "blocked_now": [
        "registry lookup",
        "pip install",
        "uv sync",
        "package upgrade"
      ],
      "owner_agent": "hermes",
      "evidence_refs": [
        "apps/api/pyproject.toml",
        "docs/evaluations/package_supply_chain_inventory_2026-06-04.json"
      ]
    },
    {
      "source_id": "npm_registry_candidate",
      "domain": "javascript_registry",
      "source_type": "JavaScript package registry freshness candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "free_public_candidate",
      "rate_limit_risk": "medium",
      "cache_policy": "cache package dist-tag and version metadata for 24h after approval",
      "data_retention_policy": "store package name, current specifier, lockfile version, latest seen version, and source timestamp",
      "permitted_after_approval": [
        "read-only package freshness comparison"
      ],
      "blocked_now": [
        "registry lookup",
        "npm audit",
        "pnpm install",
        "package upgrade",
        "lockfile write"
      ],
      "owner_agent": "hermes",
      "evidence_refs": [
        "apps/web/package.json",
        "pnpm-lock.yaml",
        "docs/evaluations/javascript_package_inventory_2026-06-04.json"
      ]
    },
    {
      "source_id": "docker_hub_manifest_candidate",
      "domain": "docker_registry",
      "source_type": "container image manifest freshness candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "free_public_candidate",
      "rate_limit_risk": "high",
      "cache_policy": "cache image tag and digest metadata for 24h after approval; throttle by image",
      "data_retention_policy": "store image ref, tag, digest, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only digest freshness comparison"
      ],
      "blocked_now": [
        "image pull",
        "docker build",
        "image rebuild",
        "registry push"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "apps/api/Dockerfile",
        "apps/web/Dockerfile",
        "docs/evaluations/docker_build_surface_inventory_2026-06-04.json"
      ]
    },
    {
      "source_id": "ghcr_manifest_candidate",
      "domain": "docker_registry",
      "source_type": "GHCR image manifest freshness candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "unknown_until_review",
      "rate_limit_risk": "high",
      "cache_policy": "cache image tag and digest metadata for 24h after approval; no pull",
      "data_retention_policy": "store image ref, tag, digest, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only digest freshness comparison"
      ],
      "blocked_now": [
        "image pull",
        "docker build",
        "image rebuild",
        "registry push"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "apps/api/Dockerfile",
        "docs/evaluations/docker_build_surface_inventory_2026-06-04.json"
      ]
    },
    {
      "source_id": "package_license_metadata_candidate",
      "domain": "license",
      "source_type": "package metadata license field candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "free_public_candidate",
      "rate_limit_risk": "medium",
      "cache_policy": "cache package license metadata for 7 days after approval",
      "data_retention_policy": "store package name, version, license expression, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only license metadata comparison"
      ],
      "blocked_now": [
        "external license lookup",
        "legal conclusion",
        "package publish",
        "package upgrade"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "docs/evaluations/dependency_risk_policy_2026-06-04.json",
        "packages/shared-types/package.json"
      ]
    },
    {
      "source_id": "deps_dev_license_candidate",
      "domain": "license",
      "source_type": "dependency graph and license metadata candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "unknown_until_review",
      "rate_limit_risk": "medium",
      "cache_policy": "cache normalized dependency/license metadata for 7 days after approval",
      "data_retention_policy": "store only package, version, license, dependency path summary, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only transitive license review"
      ],
      "blocked_now": [
        "external license lookup",
        "legal conclusion",
        "package upgrade"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "docs/evaluations/dependency_risk_policy_2026-06-04.json"
      ]
    },
    {
      "source_id": "agent_official_release_candidate",
      "domain": "agent_market",
      "source_type": "official release notes, docs, changelog, or repository release candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "unknown_until_review",
      "rate_limit_risk": "medium",
      "cache_policy": "cache source snapshots and version metadata for 7 days after approval",
      "data_retention_policy": "store product name, version or release marker, source timestamp, summary, and lookup time",
      "permitted_after_approval": [
        "read-only AI Agent market version watch",
        "candidate emergence detection",
        "operator review queue update"
      ],
      "blocked_now": [
        "unapproved market lookup",
        "SDK installation",
        "paid API call",
        "shadow/canary",
        "production routing"
      ],
      "owner_agent": "nemotron",
      "evidence_refs": [
        "docs/evaluations/agent_market_governance_snapshot_2026-06-04.json",
        "docs/ai/agent-market-watch-sources.v1.json"
      ]
    },
    {
      "source_id": "agent_benchmark_signal_candidate",
      "domain": "agent_market",
      "source_type": "public benchmark, leaderboard, or evaluation report candidate",
      "approval_status": "approval_required",
      "auth_required": false,
      "cost_profile": "unknown_until_review",
      "rate_limit_risk": "unknown",
      "cache_policy": "cache benchmark snapshot references for 7 days after approval",
      "data_retention_policy": "store benchmark name, candidate name, score summary, source timestamp, and lookup time",
      "permitted_after_approval": [
        "read-only market score evidence refresh",
        "OpenClaw replacement evidence queue update"
      ],
      "blocked_now": [
        "unapproved market lookup",
        "replacement decision",
        "shadow/canary",
        "production routing"
      ],
      "owner_agent": "openclaw",
      "evidence_refs": [
        "docs/runbooks/OPENCLAW-REPLACEMENT-EVALUATION.md",
        "docs/evaluations/agent_market_governance_snapshot_2026-06-04.json"
      ]
    }
  ],
  "notification_policy": {
    "success_notification": "成功檢查預設不即時通知，避免洗版；結果只寫入 committed snapshot 或治理看板。",
    "failure_notification": "失敗、schema mismatch、來源過期、rate-limit exhaustion、成本邊界不明或 high/critical policy hit 才通知 AwoooP / Telegram。",
    "operator_review_trigger": "任何外部來源啟用、SDK 安裝、付費 API、shadow/canary、生產路由、套件升級、lockfile 寫入或 image rebuild 都必須進人工批准。"
  },
  "operation_boundaries": {
    "read_only_plan_allowed": true,
    "schedule_activation_allowed": false,
    "workflow_write_allowed": false,
    "external_cve_lookup_allowed": false,
    "external_license_lookup_allowed": false,
    "registry_lookup_allowed": false,
    "agent_market_external_lookup_allowed": false,
    "sdk_installation_allowed": false,
    "paid_api_call_allowed": false,
    "package_installation_allowed": false,
    "package_upgrade_allowed": false,
    "lockfile_write_allowed": false,
    "docker_build_allowed": false,
    "image_pull_allowed": false,
    "image_rebuild_allowed": false,
    "registry_push_allowed": false,
    "shadow_or_canary_allowed": false,
    "production_routing_allowed": false
  },
  "approval_boundaries": {
    "sdk_installation_allowed": false,
    "paid_api_call_allowed": false,
    "shadow_or_canary_allowed": false,
    "production_routing_allowed": false,
    "destructive_operation_allowed": false
  }
}
