{
  "review_title": "UAV and Truck-Based Urban Logistics: A PRISMA Systematic Review of the State of the Art",
  "protocol_version": "1.0.0",
  "last_updated": "2026-09-29",
  "reporting_guideline": "PRISMA 2020 (Page et al., BMJ 2021;372:n71)",
  "design_note": "Two INDEPENDENT thematic streams are searched and screened separately (per author decision: trucks and drones as parallel, non-integrated lines). Each included study is later assigned to exactly one stream during synthesis. A study touching both streams is tagged BOTH but counts once in the PRISMA totals.",
  "syntax_note": "CRITICAL: OpenAlex title_and_abstract.search requires EVERY multi-word term to be double-quoted. Unquoted 'aerial delivery' is tokenized as 'aerial OR delivery' and inflated query UAV-3 from 377,164 spurious hits to a usable precision. Single words are quoted anyway for uniformity. Scopus TITLE-ABS-KEY accepts the same syntax.",
  "expected_scale": "VERIFIED 2026-09-29 with fully quoted phrases. OpenAlex / Scopus reported totals: UAV-1 2173/1623, UAV-2 1676/1467, UAV-3 1674/1038, TRUCK-1 1510/1158, TRUCK-2 1298/846, TRUCK-3 1866/1160. A result an order of magnitude ABOVE these means a quoting regression, not real literature. A result far BELOW means the phrase set was over-constrained - check for over-quoting.",
  "streams": [
    {
      "id": "UAV",
      "label": "UAV / Drone-based urban logistics",
      "queries": [
        {
          "id": "UAV-1",
          "title_abstract": "(\"unmanned aerial vehicle\" OR \"UAV\" OR \"drone\" OR \"drones\" OR \"drone delivery\") AND (\"last mile\" OR \"last-mile\" OR \"urban logistics\" OR \"city logistics\" OR \"parcel delivery\" OR \"postal delivery\")",
          "rationale": "Core concept set: aerial vehicle + urban/last-mile delivery context."
        },
        {
          "id": "UAV-2",
          "title_abstract": "(\"UAV\" OR \"drone\" OR \"drones\") AND (\"vehicle routing\" OR \"routing problem\" OR \"fleet sizing\" OR \"delivery fleet\")",
          "rationale": "Covers the routing/operations decision literature for drone fleets."
        },
        {
          "id": "UAV-3",
          "title_abstract": "(\"aerial delivery\" OR \"drone-based delivery\" OR \"drone transportation\" OR \"drone hub\" OR \"vertiport\")",
          "rationale": "Captures infrastructure and hub/network terminology."
        }
      ]
    },
    {
      "id": "TRUCK",
      "label": "Truck-based urban freight and logistics",
      "queries": [
        {
          "id": "TRUCK-1",
          "title_abstract": "(\"truck\" OR \"trucks\" OR \"lorry\" OR \"lorries\" OR \"heavy goods vehicle\" OR \"freight vehicle\") AND (\"urban logistics\" OR \"city logistics\" OR \"urban freight\" OR \"last-mile delivery\" OR \"last mile delivery\")",
          "rationale": "Core concept set: road freight vehicle + urban logistics context."
        },
        {
          "id": "TRUCK-2",
          "title_abstract": "(\"urban freight\" OR \"city logistics\" OR \"urban distribution\" OR \"urban delivery\") AND (\"vehicle routing problem\" OR \"vehicle routing\" OR \"routing\")",
          "rationale": "Captures the classic VRP/urban-freight formulation literature."
        },
        {
          "id": "TRUCK-3",
          "title_abstract": "(\"truck\" OR \"truck fleet\" OR \"electric truck\" OR \"delivery truck\") AND (\"urban delivery\" OR \"door-to-door\" OR \"cross-docking\" OR \"depot\")",
          "rationale": "Fleet composition, electrification and terminal operations."
        }
      ]
    }
  ],
  "databases": [
    {
      "id": "openalex",
      "name": "OpenAlex",
      "endpoint": "https://api.openalex.org/works",
      "auth": "none (polite pool via mailto)",
      "abstracts": true,
      "notes": "Primary source for abstracts, keywords and language. Filter used: title_and_abstract.search"
    },
    {
      "id": "scopus",
      "name": "Scopus",
      "endpoint": "https://api.elsevier.com/content/search/scopus",
      "auth": "X-ELS-APIKey header",
      "view": "STANDARD",
      "abstracts": false,
      "notes": "IMPORTANT: institutional subscription does NOT include view=COMPLETE/META_ABS (returns 401 AUTHORIZATION_ERROR). STANDARD view returns metadata + cited_by_count but NO abstract. Scopus therefore enriches citation counts and coverage; abstracts must come from OpenAlex.",
      "service_level_limits": {
        "count_max": 25,
        "start_max": 4000,
        "cursor_allowed": false,
        "max_records_per_query": 4000,
        "verified_errors": {
          "count>25": "400 INVALID_INPUT Exceeds the maximum number allowed for the service level",
          "start>=5000": "400 INVALID_INPUT Exceeds the number of search results",
          "cursor": "403 ENTITLEMENTS_ERROR Use of the cursor parameter is restricted",
          "transient": "400 INVALID_INPUT Error translating query (retries successfully; handled with backoff)"
        },
        "implication": "Offset pagination only; the ceiling is 4000 records per query. All current queries are far below it, so no truncation is expected - but verify truncated=false in scopus_manifest.json."
      }
    }
  ],
  "execution": {
    "page_size": 200,
    "max_records_per_query": 20000,
    "max_retries": 12,
    "backoff_ms": 10000,
    "user_agent": "PRISMA-UAV-Truck-Review/1.0 (mailto:ricardo.palma@ingenieria.uncoyo.edu.ar)",
    "notes": "OpenAlex periodically returns HTTP 503 'Search temporarily unavailable'. The fetcher retries with exponential backoff and records per-query status so the PRISMA count log stays honest. Never silently drop a failed query. Pacing: ~1.5s between OpenAlex requests; 429 Rate limit exceeded is common on shared IPs and is retried with exponential backoff. Scopus page size is capped at 25 by service level, so a Scopus query of ~1600 records needs ~65 sequential requests (~1-2 min). Set expectations accordingly; do not kill the run early. max_records_per_query was raised from 2000 to 20000 after a silent truncation: UAV-1 reported 2173 but only 2000 were retrieved because the page loop was hard-capped at 10 pages (10 x 200 per-page). The page cap is now derived from max_records_per_query instead of hardcoded. Pacing raised to 4s between requests with 8s base backoff after OpenAlex began returning sustained HTTP 429 (2026-09-29). A full 6-query OpenAlex run then takes ~15-25 min. Let it finish; killing it mid-query leaves that query marked error. fetchJson honours the Retry-After header (OpenAlex returns ~30-40s); that matters more than exponential backoff when the IP is throttled. max_retries=12.",
    "inter_request_delay_ms": 3000,
    "scopus_page_size": 25,
    "openalex_quota_note": "2026-09-29: OpenAlex returned x-ratelimit-remaining=0 with retry-after ~28000s after the initial retrieval. Daily credits reset roughly every 24h. UAV-1 is therefore short by 174 records (2000 of 2174). Remediation after reset: node code_r/search_openalex.mjs UAV && node code_r/rebuild_manifest.mjs && node code_r/merge_dedupe.mjs"
  },
  "deduplication": {
    "primary_key": "doi_lowercase",
    "fallback_key": "normalized_title_first_100_chars",
    "merge_rule": "Union of records. Prefer OpenAlex metadata; attach Scopus cited_by_count and EID when a DOI matches. Preserve per-database provenance for the PRISMA identification count."
  },
  "observed_totals": {
    "_comment": "Reported totalResults per query as returned by each API on 2026-09-29. Used by code_r/rebuild_manifest.mjs to reconstruct the PRISMA query log from disk after an interrupted run.",
    "openalex/UAV-1": {
      "reported": 2174,
      "observed_on": "2026-09-29"
    },
    "openalex/UAV-2": {
      "reported": 1676,
      "observed_on": "2026-09-29"
    },
    "openalex/UAV-3": {
      "reported": 1674,
      "observed_on": "2026-09-29"
    },
    "openalex/TRUCK-1": {
      "reported": 1510,
      "observed_on": "2026-09-29"
    },
    "openalex/TRUCK-2": {
      "reported": 1298,
      "observed_on": "2026-09-29"
    },
    "openalex/TRUCK-3": {
      "reported": 1866,
      "observed_on": "2026-09-29"
    },
    "scopus/UAV-1": {
      "reported": 1623,
      "observed_on": "2026-09-29"
    },
    "scopus/UAV-2": {
      "reported": 1467,
      "observed_on": "2026-09-29"
    },
    "scopus/UAV-3": {
      "reported": 1038,
      "observed_on": "2026-09-29"
    },
    "scopus/TRUCK-1": {
      "reported": 1158,
      "observed_on": "2026-09-29"
    },
    "scopus/TRUCK-2": {
      "reported": 846,
      "observed_on": "2026-09-29"
    },
    "scopus/TRUCK-3": {
      "reported": 1160,
      "observed_on": "2026-09-29"
    }
  }
}