{
  "_comment": "Audit scope for marketing-data-audit. Copy this file into the run folder, replace every <placeholder> and delete example elements you do not need (extra_blocking, threshold_overrides). score_audit.py stops on any value still in angle brackets. JSON has no comments, so notes live in _comment keys. score_audit.py reads as_of, outputs, threshold_overrides and domain_weights; check_dbt_artifacts.py --config reads outputs[].models; the rest is the record a colleague needs. Owners are roles, never names. No credentials anywhere in this file.",
  "audit_name": "<company> marketing data audit, <month YYYY>",
  "as_of": "<YYYY-MM-DD run date>",
  "run_folder": "<folder in the user's project for every file of this run, for example audits/marketing-data-audit-YYYY-MM-DD>",
  "previous_run": "<run folder of the last audit for a re-score, or an empty string>",
  "business_time_zone": "<IANA zone, for example America/New_York>",
  "reporting_currency": "<ISO 4217 code, for example USD>",
  "query_budget": {
    "_comment": "Agreed with the user before any query (procedure step 3). Stop and ask before a query estimated above per_query. BigQuery: bytes billed. Snowflake: warehouse size and statement timeout.",
    "total": "<for example 20 GB billed>",
    "per_query": "<for example 2 GB billed>",
    "agreed_with": "<role>"
  },
  "warehouse": {
    "platform": "<bigquery | snowflake>",
    "location": "<BigQuery location or Snowflake region>",
    "datasets": ["<dataset or database.schema the outputs read>"],
    "read_route": "<execute_sql_readonly on the BigQuery remote MCP server | Snowflake SYSTEM_EXECUTE_SQL with read_only true | read-only role | query exports from a colleague>"
  },
  "window": {
    "_comment": "Default: the last 28 days ending at run date minus 4 days, the newest GA4 daily table past its update window (a run on 2026-11-01 covers 2026-10-01 to 2026-10-28). Ad conversions restate for longer; REC-03 and FRS-05 handle that with their own periods, so do not move the whole window. Monthly checks use the last closed month; FRS-05 also uses the month before the reload window.",
    "start": "<YYYY-MM-DD>",
    "end": "<YYYY-MM-DD>",
    "maturity_rule": "<run date minus 4 days, or a later end that a source needs, and why>",
    "monthly_period": "<YYYY-MM>",
    "older_month_for_frs_05": "<YYYY-MM>"
  },
  "outputs": [
    {
      "_comment": "One to five outputs. type is one of paid_media_performance, pipeline_and_lead_source, revenue_attribution, activation_audience_or_upload, executive_kpi. The type sets the blocking checks; extra_blocking can add checks with a reason, never remove one.",
      "id": "O1",
      "name": "<dashboard, report, audience or upload name>",
      "type": "<output type>",
      "consumer": "<role that uses it>",
      "decision": "<the decision it informs, in one sentence>",
      "deadline": "<when the consumer needs fresh data, with time zone>",
      "owner": "<role accountable for the output>",
      "in_use": true,
      "models": ["<model or table the output reads>"],
      "extra_blocking": [
        {"check_id": "<check ID, for example OPS-08>", "reason": "<why it blocks this output>"}
      ]
    }
  ],
  "sources": [
    {
      "_comment": "One row per manifest slice, taken from the platform's own account list (FRS-01).",
      "system": "<google_ads | facebook_ads | linkedin_ads | microsoft_ads | ga4 | hubspot | salesforce | stripe | other>",
      "account": "<account, property or portal ID (placeholder format, never a secret)>",
      "environment": "<production | sandbox | test>",
      "native_time_zone": "<IANA zone>",
      "currency": "<ISO 4217 code>",
      "connector": "<Fivetran, Airbyte, Data Transfer Service, native export, custom job>",
      "reload_window_days": 0,
      "restatement_window_days": 0,
      "owner": "<role>"
    }
  ],
  "threshold_overrides": [
    {"check_id": "<check ID>", "threshold": "<value used instead of the default>", "reason": "<metrics.md or decisions.md entry, dated>"}
  ],
  "domain_weights": null,
  "domain_weights_reason": "<only when domain_weights is set; the report prints it>"
}
