056c47581f
Ships the second dashboard surface — a Pattern Library + Preview Theatre — that presents the 4-section PDP pilot batch back to Umar, compliance, and the board in an editorial format. Adds the full data layer that drives it: 5 source-backed per-SKU drafts at QA 100/100, 15 competitor PDP semantic extracts, PubMed evidence packs, EFSA claims library extension, JV brand voice guide, hand-curated product FAQs, and the Matrixify-ready CSV exports for Lewis. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
288 lines
8.6 KiB
JSON
288 lines
8.6 KiB
JSON
{
|
|
"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"
|
|
]
|
|
}
|