{
  "schema_version": "1.1",
  "workshop_id": "qgis4-london-heat",
  "workshop_name": "Where Heat Meets People",
  "workshop_subtitle": "A checked London QGIS proof from one frozen GeoParquet to one reopened PDF.",
  "opening_question": "Can you trust a map that QGIS says loaded?",
  "analysis_question": "Which London cells meet the map's declared upper class boundary, and what can this snapshot not tell us?",
  "prepared_on": "2026-08-05",
  "participant_contract": {
    "format": "25-minute guided London build plus 5 minutes of questions",
    "pre_clock_state": "The archive is extracted and QGIS 4.2 has 00_open.qgz open with no GeoParquet layer loaded.",
    "timed_output": "One reopened PDF or checked reference fallback, one bounded observation and one reusable five-check rule.",
    "outside_scope": "No live STAC, Overture, DuckDB, arbitrary-city execution, model, provider, API key, MCP server, additional plug-in, social export or web-map generation.",
    "semantic_alignment": "The guide, brief, participant archive and both QGIS deck archives match the corrected timed London contract."
  },
  "release": {
    "engineering": "qgis42_clean_directory_archives_passed_technical_rehearsal_candidate",
    "delivery": "blocked_on_human_and_second_machine_rehearsals",
    "public_surface": "public_workshop_routes_included_human_delivery_gate_pending",
    "full_participant_pack": "qgis42_clean_directory_pass_semantic_alignment_current_final_event_release_withheld",
    "organiser": "speaker_and_slots_pending_confirmation"
  },
  "presentations": [
    {
      "id": "lecture",
      "title": "Silent Success",
      "duration_minutes": 15,
      "slide_count": 16,
      "public_route": "/workshops/qgis4-london-heat/presentation",
      "projector_route": "/workshops/qgis4-london-heat/slides/silent-success.html",
      "status": "public_route_included_presenter_notes_excluded"
    },
    {
      "id": "workshop",
      "title": "Where Heat Meets People",
      "duration_minutes": 25,
      "question_minutes": 5,
      "slide_count": 12,
      "public_route": "/workshops/qgis4-london-heat/workshop-slides",
      "status": "public_route_included_human_delivery_gate_pending"
    }
  ],
  "publication_gate": {
    "status": "blocked",
    "checked_on": "2026-08-06",
    "gate_scope": "Existing public editorial story family, separate from the technical QGIS verifier exports.",
    "current_a3_png_pixels": [2480, 1753],
    "current_a3_png_dpi": 150,
    "required_a3_png_pixels": [4961, 3508],
    "required_a3_png_dpi": 300,
    "vector_pdf_available": false,
    "known_failures": [
      "The existing A3 image is a visual benchmark, not a final publication export.",
      "The scale and north arrow need at least 6 millimetres clearance, both scale endpoints and a visible unit.",
      "The title must state the finding, and all sources and caveats must be at least 8 point at actual A3 size.",
      "The social proof needs essential text at least 36 pixels at the 1080 by 1350 source size.",
      "The A3 exposure map and social night chart use different measures, so they are not yet one publication-equivalent family."
    ]
  },
  "evidence": {
    "scope": "exact_archive_technical_rehearsal_publication_not_event_release",
    "verified_on": "2026-08-08",
    "qgis_runtime": "4.2.0",
    "workflow_steps_passed": 9,
    "workflow_steps_total": 9,
    "rescue_projects_passed": 6,
    "feature_count": 16659,
    "classified_feature_count": 16659,
    "selected_feature_count": 105,
    "selected_share_percent": 0.63,
    "selection_expression": "\"heat_exposure_pk_per_km2\" >= 40000",
    "geoparquet_spatial_reference": "OGC:CRS84",
    "source_bytes_unchanged": true,
    "plugin_archive_acceptance": {
      "scope": "separate_mapwright_plugin_candidate_not_used_in_participant_flow",
      "status": "automated_pass_human_gate_blocked",
      "sha256": "32d2f954458ca5f302cae21958e6638f90f13c83846d8524ed31ee42119310ad",
      "bytes": 297583,
      "members": 57,
      "exact_source_parity": true,
      "automated_steps_passed": 31,
      "automated_steps_failed": 0,
      "steps_needing_human": 2,
      "a3_export_pixels": [4961, 3508],
      "lifecycle_result": "passed",
      "replay_result": "passed",
      "published_plugin_archive_available": false
    },
    "participant_archive_acceptance": {
      "status": "qgis42_clean_directory_pass_human_gate_pending",
      "sha256": "9ce3bfe0aed12ab5c8928c18d9bbb6542d8c05c9a6c794abb716bdd94450c649",
      "bytes": 9951681,
      "members": 18,
      "clean_directory_runtime_passed": true,
      "rescue_projects_passed": 6,
      "qgis_decks_passed": 2,
      "atlas_pages_rendered": 28,
      "runtime_replay_runs_passed": 2,
      "human_rehearsal_passed": false,
      "second_physical_machine_passed": false,
      "published_rehearsal_archive_available": true,
      "published_event_release_available": false,
      "content_alignment": "current_timed_london_contract_embedded"
    },
    "candidate_build_reproducibility": {
      "result": "identical",
      "scope": "final_source_checkout_candidate",
      "method": "two_independent_final_source_builds_compared_byte_for_byte",
      "source_checkout_verified": true,
      "live_qgis_repository_landed": false,
      "published_participant_pack_available": true,
      "publication_scope": "technical_rehearsal_candidate_only",
      "published_contract_current": true
    }
  },
  "assets": [
    {
      "id": "workshop_brief",
      "label": "Shareable workshop brief",
      "description": "The public workshop and companion talk, with their abstracts, audiences, agenda, outcomes, technology, design contract and honest readiness status in one portable JSON file.",
      "path": "/workshops/qgis4-london-heat/workshop-brief.json",
      "download_name": "where-heat-meets-people-workshop-brief.json",
      "media_type": "application/json",
      "format": "JSON",
      "bytes": 12290,
      "sha256": "f6b899086886f394733c50f5511bbbb04bbc14e669819dd3f2020c0f9bf023db",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "lecture_deck_bundle",
      "label": "Silent Success lecture deck",
      "description": "A portable public bundle containing the browser player and the same 16 slide images used by the QGIS deck. Presenter notes and private operating prompts are excluded.",
      "path": "/workshops/qgis4-london-heat/slides/silent-success-public.zip",
      "download_name": "silent-success-public-lecture.zip",
      "media_type": "application/zip",
      "format": "ZIP",
      "bytes": 2379506,
      "sha256": "c9d9820a89e0919dca91a0ee37adefe687b16459b9f8a1358a1638dea5743353",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "qgis_native_lecture_deck",
      "label": "Silent Success QGIS 4.2 deck",
      "description": "A QGIS 4.2 Atlas archive for 16 corrected lecture slides, with relative paths and a regenerated 16-page PDF fallback. Presenter notes are excluded.",
      "path": "/workshops/qgis4-london-heat/qgis/silent-success-qgis42.zip",
      "download_name": "silent-success-qgis42.zip",
      "media_type": "application/zip",
      "format": "QGIS 4.2 ZIP",
      "bytes": 4538301,
      "sha256": "ac9f317e9ddff45c626ef958ac4cbf4f5c18d48207eee9e421cdcfa1cec8ca2a",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "qgis_native_workshop_deck",
      "label": "Where Heat Meets People QGIS 4.2 deck",
      "description": "A QGIS 4.2 Atlas archive for the corrected 12-slide workshop, with relative paths and a regenerated 12-page PDF fallback. Presenter notes are excluded.",
      "path": "/workshops/qgis4-london-heat/qgis/where-heat-meets-people-qgis42.zip",
      "download_name": "where-heat-meets-people-qgis42.zip",
      "media_type": "application/zip",
      "format": "QGIS 4.2 ZIP",
      "bytes": 9387494,
      "sha256": "2d510d5e67fd72149b1fe0f602bc4dafa4b5a4acc21b17d6528beb82994cf157",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "participant_rehearsal_pack",
      "label": "QGIS 4.2 participant rehearsal pack",
      "description": "A London-only technical rehearsal candidate with the aligned participant guide, six recovery projects, checked evidence, styles, an export reference and an offline web-map reference. Human room and second-machine checks remain.",
      "path": "/workshops/qgis4-london-heat/qgis/where-heat-meets-people-qgis42-rehearsal.zip",
      "download_name": "where-heat-meets-people-qgis42-rehearsal.zip",
      "media_type": "application/zip",
      "format": "QGIS 4.2 ZIP",
      "bytes": 9951681,
      "sha256": "9ce3bfe0aed12ab5c8928c18d9bbb6542d8c05c9a6c794abb716bdd94450c649",
      "licence": "Mixed, see manifest",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "qgis_acceptance_report",
      "label": "QGIS 4.2 archive acceptance report",
      "description": "Machine-readable evidence from reopening and rendering the exact three public archives after extraction to a random path containing spaces and non-ASCII text.",
      "path": "/workshops/qgis4-london-heat/qgis/acceptance.json",
      "download_name": "qgis4-workshop-acceptance.json",
      "media_type": "application/json",
      "format": "JSON",
      "bytes": 2407,
      "sha256": "a60b8e2036e2355bdd2f4290b31b5ac0f6073bc7c6d2f28e818e18f4b5e26086",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "geoparquet",
      "label": "London H3 heat exposure GeoParquet",
      "description": "The frozen, cloud-native vector layer used in the workshop proof loop.",
      "path": "/workshops/qgis4-london-heat/data/h3_heat_exposure_r9.parquet",
      "download_name": "h3_heat_exposure_r9.parquet",
      "media_type": "application/vnd.apache.parquet",
      "format": "GeoParquet",
      "bytes": 1737199,
      "sha256": "83e85876878e3a319a0908c8578d0601fe47ab52c86c712ba4c7b1f7f3a14be5",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "participant_guide",
      "label": "Participant start guide",
      "description": "A self-contained two-page guide with preparation, nine timed phases, five proof checks, checkpoint recovery and a protected question period.",
      "path": "/workshops/qgis4-london-heat/participant-guide.html",
      "download_name": "qgis4-london-heat-participant-guide.html",
      "media_type": "text/html",
      "format": "HTML",
      "bytes": 27770,
      "sha256": "aef5f93d216990cdc2a25c62765e8ee27310a6a56d4a576fdf5a1bc09aaa7ed7",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "open"
    },
    {
      "id": "broken_style",
      "label": "Intentionally broken QGIS style",
      "description": "The valid QML used to demonstrate a silent field-contract failure. It requests a field the frozen GeoParquet does not contain.",
      "path": "/workshops/qgis4-london-heat/styles/heat-exposure-broken.qml",
      "download_name": "heat-exposure-broken.qml",
      "media_type": "application/xml",
      "format": "QGIS QML",
      "bytes": 30972,
      "sha256": "0bf03ef097a7ff07e2df1118046069ed275f394a749cdb01fcb08ee5065f03d2",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "fixed_style",
      "label": "Repaired QGIS style",
      "description": "The matched seven-class QML used to repair the renderer and prove that all 16,659 cells are classified.",
      "path": "/workshops/qgis4-london-heat/styles/heat-exposure-fixed.qml",
      "download_name": "heat-exposure-fixed.qml",
      "media_type": "application/xml",
      "format": "QGIS QML",
      "bytes": 30984,
      "sha256": "2dd6fdd7fa1bb287260133e9514065f842fad26fe30ec57b3f2fb36620c94966",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "proof_card",
      "label": "Printable proof card and exit ticket",
      "description": "A self-contained two-page reference with the five end-state checks and a contact-free paper feedback fallback.",
      "path": "/workshops/qgis4-london-heat/proof-card.html",
      "download_name": "qgis4-london-heat-proof-card.html",
      "media_type": "text/html",
      "format": "HTML",
      "bytes": 12372,
      "sha256": "5c2790a30bf1498d6d7f61d1dba61d38a77de5093d633ca3d424afecfdb411d6",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "open"
    },
    {
      "id": "report_pdf",
      "label": "Verified workshop map PDF",
      "description": "The checked QGIS Layout export with observation, conditions and attribution.",
      "path": "/workshops/qgis4-london-heat/reports/london-heat-proof-map.pdf",
      "download_name": "london-heat-proof-map.pdf",
      "media_type": "application/pdf",
      "format": "PDF",
      "bytes": 1446148,
      "sha256": "fa745949f311d0e4f2d06915f97a1e0053501a2bad7ec08ebe1c425956294f8e",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "map_png",
      "label": "Verified workshop map image",
      "description": "A 1,753 by 1,240 pixel reference render of the checked layout.",
      "path": "/workshops/qgis4-london-heat/reports/london-heat-proof-map.png",
      "download_name": "london-heat-proof-map.png",
      "media_type": "image/png",
      "format": "PNG",
      "bytes": 1114198,
      "sha256": "59416d45784c679a629382254f3d3ebb39b9578d062a99eac83b9b7879b3032d",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "offline_web_map",
      "label": "Offline web map",
      "description": "A separate self-contained reference map with the PMTiles archive embedded in the file. It is not produced during the timed participant build and needs no adjacent data file or API key.",
      "path": "/workshops/qgis4-london-heat/web/index.html",
      "download_name": "qgis4-london-heat-offline-map.html",
      "media_type": "text/html",
      "format": "HTML",
      "bytes": 4740865,
      "sha256": "c06fdd4ea7c35a9f0eed1efef08477ad14653615d22b586c107f80b23791e0e0",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "open"
    },
    {
      "id": "story_a3",
      "label": "London heat story, A3 composition",
      "description": "A separate 150 dpi London editorial benchmark, not a timed participant output. It does not pass the final publication gate.",
      "path": "/workshops/qgis4-london-heat/reports/london-heat-story-a3.png",
      "download_name": "london-heat-story-a3.png",
      "media_type": "image/png",
      "format": "PNG",
      "bytes": 3706769,
      "sha256": "3ebaaf962c036292590524994ec4514da506452a0161709f117471f20105cf22",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "story_social",
      "label": "Compound heat social card",
      "description": "A separate 1080 by 1350 London information-design benchmark, not a timed participant output. Its essential text does not yet pass the 360 pixel phone gate.",
      "path": "/workshops/qgis4-london-heat/reports/london-compound-heat-social.png",
      "download_name": "london-compound-heat-social.png",
      "media_type": "image/png",
      "format": "PNG",
      "bytes": 131343,
      "sha256": "d734ab66b27006436c192b0da6adad9b72ada9848f3d5a8973a893a17bdb7e57",
      "licence": "CC-BY-4.0",
      "surface": "card",
      "action": "download"
    },
    {
      "id": "story_hero",
      "label": "London heat story hero map",
      "description": "The dark editorial map used on the workshop page and as the cartographic hierarchy reference.",
      "path": "/workshops/qgis4-london-heat/reports/london-heat-story-hero.png",
      "download_name": "london-heat-story-hero.png",
      "media_type": "image/png",
      "format": "PNG",
      "bytes": 2669609,
      "sha256": "e9f97d0e52a60fcc03cc74f6c916d390101dd09144626b1a5a59d71b0bedda37",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    },
    {
      "id": "pmtiles",
      "label": "Optional London heat PMTiles archive",
      "description": "A separate direct-use spatial archive for building another compatible client. The self-contained offline HTML does not request this file.",
      "path": "/workshops/qgis4-london-heat/web/london_heat.pmtiles",
      "download_name": "london_heat.pmtiles",
      "media_type": "application/vnd.pmtiles",
      "format": "PMTiles",
      "bytes": 2689616,
      "sha256": "342ffce16de529539eab8a3ae59e325df5f4973509a1a57a5d2f6b17524b3455",
      "licence": "CC-BY-4.0",
      "surface": "supporting",
      "action": "download"
    }
  ],
  "licence": {
    "authored_and_derived_work": "CC-BY-4.0",
    "licence_url": "https://creativecommons.org/licenses/by/4.0/",
    "verification_note": "This records the terms checked on the dates below. It is not legal advice, and terms can change.",
    "attribution_for_data": [
      "Landsat Collection 2 Level-2 image courtesy of the U.S. Geological Survey.",
      "Source: Office for National Statistics licensed under the Open Government Licence v.3.0.",
      "Contains OS data © Crown copyright and database right 2026."
    ],
    "additional_attribution_for_map_outputs": [
      "© OpenStreetMap contributors, available under the Open Database Licence (ODbL) 1.0.",
      "Produced using Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved.",
      "Colour ramp: matplotlib inferno, as distributed with QGIS, CC0."
    ],
    "terms_checked": [
      {
        "organisation": "U.S. Geological Survey",
        "url": "https://www.usgs.gov/faqs/are-there-any-restrictions-use-or-redistribution-landsat-data",
        "checked_on": "2026-08-05"
      },
      {
        "organisation": "Office for National Statistics",
        "url": "https://www.ons.gov.uk/methodology/geography/licences",
        "checked_on": "2026-08-05"
      },
      {
        "organisation": "Ordnance Survey",
        "url": "https://www.ordnancesurvey.co.uk/products/product-support",
        "checked_on": "2026-08-05"
      },
      {
        "organisation": "Open Government Licence",
        "url": "https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
        "checked_on": "2026-08-05"
      }
    ]
  },
  "caveats": [
    "The source is one Landsat 9 daytime scene captured at 10:52 UTC on 29 July 2026, not a summer average or a night-time heat study.",
    "Land surface temperature is not air temperature, mean radiant temperature, thermal comfort or individual heat risk.",
    "Population is a modelled dasymetric estimate and must not be interpreted at household or individual level.",
    "The 40,000 person-kelvin per square kilometre boundary is an author-declared cartographic class boundary, not a health threshold.",
    "H3 resolution 9 is an author-chosen analytical support, so different spatial units can change the pattern.",
    "The 30 metre grid resamples a roughly 100 metre native thermal observation; sub-100 metre detail is interpolation rather than independent measurement."
  ]
}
