{
  "generatedAt": "2026-05-20T16:49:26.553Z",
  "ready": false,
  "counts": {
    "providers": 2,
    "approvalsValid": 1,
    "checks": 23,
    "passing": 14,
    "blocked": 9
  },
  "files": {
    "dataforseoApproval": "data/sources/approvals/dataforseo-stage1-approval.json",
    "apifyApproval": "data/sources/approvals/apify-stage2-approval.json",
    "reportMd": "content_population_exports/source_acquisition_approval_gate.md",
    "reportCsv": "content_population_exports/source_acquisition_approval_gate.csv",
    "reportJson": "content_population_exports/source_acquisition_approval_gate.json"
  },
  "guardrails": [
    "Approval is local and explicit; it does not store provider credentials.",
    "Approval must match the budget cap and staged run limits exactly.",
    "A human approval cannot bypass source, budget, provider preflight, or post-run review gates.",
    "Apify approval also requires a named gap from the DataForSEO pilot review."
  ],
  "approvals": [
    {
      "key": "dataforseoStage1",
      "provider": "DataForSEO",
      "stage": 1,
      "file": "data/sources/approvals/dataforseo-stage1-approval.json",
      "approved": false,
      "valid": false,
      "approval": {
        "provider": "DataForSEO",
        "stage": 1,
        "approved": false,
        "approvedBy": "",
        "approvedAt": "",
        "approvalScope": "fill before spending provider credits",
        "budgetRef": "data/sources/budgets/source-acquisition-budget.json",
        "decisionRef": "content_population_exports/dataforseo_task_preflight.json",
        "currency": "GBP",
        "maxSpendApproved": 0,
        "expectedMaxSpend": 5,
        "targetCapApproved": 0,
        "expectedTargetCap": 10,
        "runLimitApproved": 0,
        "expectedRunLimit": 1,
        "depthOrRequestCapApproved": 0,
        "expectedDepthOrRequestCap": 100,
        "hardStopAcknowledged": false,
        "noCredentialStorageAcknowledged": false,
        "postRunReviewRequired": true,
        "namedGapForApify": "",
        "notes": "Held because DataForSEO reviews endpoint remains officially marked temporarily unavailable."
      }
    },
    {
      "key": "apifyStage2",
      "provider": "Apify",
      "stage": 2,
      "file": "data/sources/approvals/apify-stage2-approval.json",
      "approved": true,
      "valid": true,
      "approval": {
        "provider": "Apify",
        "stage": 2,
        "approved": true,
        "approvedBy": "user",
        "approvedAt": "2026-05-20T16:48:36.463Z",
        "approvalScope": "starter top-3 paid scrape lane only",
        "budgetRef": "data/sources/budgets/source-acquisition-budget.json",
        "decisionRef": "data/sources/reviews/dataforseo-stage1-review.json",
        "currency": "GBP",
        "maxSpendApproved": 5,
        "expectedMaxSpend": 5,
        "targetCapApproved": 3,
        "expectedTargetCap": 3,
        "runLimitApproved": 1,
        "expectedRunLimit": 1,
        "depthOrRequestCapApproved": 100,
        "expectedDepthOrRequestCap": 100,
        "hardStopAcknowledged": true,
        "noCredentialStorageAcknowledged": true,
        "postRunReviewRequired": true,
        "namedGapForApify": "Top-3 raw competitor/social/review evidence expansion under starter budget",
        "notes": "User requested a few-dollar first run, then proceed to scrape."
      }
    }
  ],
  "checks": [
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Approved flag true",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "approved=false"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Approver recorded",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "missing approver"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Approval timestamp recorded",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "missing timestamp"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Budget lane enabled",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "enabled=true"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Cost plan ready",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "cost plan ready"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Max spend matches budget cap",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "GBP 0 approved / 5 budget"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Target cap matches staged lane",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "0 approved / 10 expected"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Run limit matches staged lane",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "0 approved / 1 expected"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Depth/request cap matches staged lane",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "0 approved / 100 expected"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "Hard stop acknowledged",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "hardStopAcknowledged=false"
    },
    {
      "Provider": "DataForSEO",
      "Stage": "1",
      "Check": "No credential storage acknowledged",
      "Status": "blocked",
      "Blocking": "yes",
      "Evidence": "noCredentialStorageAcknowledged=false"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Approved flag true",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "approved=true"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Approver recorded",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "user"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Approval timestamp recorded",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "2026-05-20T16:48:36.463Z"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Budget lane enabled",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "enabled=true"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Cost plan ready",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "cost plan ready"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Max spend matches budget cap",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "GBP 5 approved / 5 budget"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Target cap matches staged lane",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "3 approved / 3 expected"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Run limit matches staged lane",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "1 approved / 1 expected"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Depth/request cap matches staged lane",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "100 approved / 100 expected"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Hard stop acknowledged",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "hardStopAcknowledged=true"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "No credential storage acknowledged",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "noCredentialStorageAcknowledged=true"
    },
    {
      "Provider": "Apify",
      "Stage": "2",
      "Check": "Named Apify gap recorded",
      "Status": "pass",
      "Blocking": "yes",
      "Evidence": "Top-3 raw competitor/social/review evidence expansion under starter budget"
    }
  ],
  "nextActions": [
    "DataForSEO Stage 1: Approved flag true - approved=false",
    "DataForSEO Stage 1: Approver recorded - missing approver",
    "DataForSEO Stage 1: Approval timestamp recorded - missing timestamp",
    "DataForSEO Stage 1: Max spend matches budget cap - GBP 0 approved / 5 budget",
    "DataForSEO Stage 1: Target cap matches staged lane - 0 approved / 10 expected",
    "DataForSEO Stage 1: Run limit matches staged lane - 0 approved / 1 expected",
    "DataForSEO Stage 1: Depth/request cap matches staged lane - 0 approved / 100 expected",
    "DataForSEO Stage 1: Hard stop acknowledged - hardStopAcknowledged=false",
    "DataForSEO Stage 1: No credential storage acknowledged - noCredentialStorageAcknowledged=false"
  ]
}
