{
  "schemaVersion": 1,
  "methodId": "flighttrove-adsb-lol-historical-derivation-v1",
  "effectiveDate": "2026-10-12",
  "documentationRevision": 13,
  "operator": "FlightTrove",
  "publicMethodUrl": "https://flighttrove.app/open-data/adsb-lol-historical-derivation-v1.json",
  "compliancePageUrl": "https://flighttrove.app/open-data",
  "source": {
    "provider": "ADSB.lol",
    "databaseFamily": "globe_history",
    "repositoryPolicy": "adsblol/globe_history_{yyyy}",
    "historicalDocumentationUrl": "https://www.adsb.lol/docs/open-data/historical/",
    "license": "ODbL-1.0",
    "licenseUrl": "https://opendatacommons.org/licenses/odbl/1-0/",
    "sourceUnit": "UTC source day",
    "assetFormat": "per-aircraft readsb trace JSON gzip"
  },
  "classification": {
    "persistentHistoricalEvidence": "ODbL Derivative Database, including persistent historical feature, score, candidate, selection and outcome layers listed below",
    "userFacingT24Forecasts": "Produced Work",
    "independentFlightTroveDatabases": "separate/independent database contents, not inputs to this derivation"
  },
  "derivativeDatabaseLicense": {
    "identifier": "ODbL-1.0",
    "url": "https://opendatacommons.org/licenses/odbl/1-0/",
    "additionalContentsPermission": "To the extent owned by FlightTrove, copyright and neighbouring rights in FlightTrove-added derivative contents are licensed worldwide, royalty-free, non-exclusively and irrevocably for copying, modifying, adapting and redistributing for any purpose, including commercial use, without additional restrictions beyond ODbL where applicable to the database. This does not override third-party rights or grant rights over independent personal databases.",
    "scope": "The historical derivative database, including FlightTrove-added coverage, spatial, aggregate, quality, provenance, historical-feature, score, candidate, selection and outcome contents, is made available under ODbL 1.0 without additional restrictions. The listed source-derived downstream layers are conservatively included irrespective of their product/shadow naming. Independent account and user-event databases are outside this grant; source-derived contents do not lose ODbL protection when referenced from them."
  },
  "additionalContents": [
    "EUROPE_V1 source-controlled coverage definition",
    "H3 resolution-5 spatial cells",
    "H3 resolution-7 observed route-corridor cells and their canonical H3 resolution-5 hierarchy parents",
    "bounded route-by-R5-parent packs of exact H3 resolution-7 corridor evidence",
    "canonical source-selection and archive-safety policy identifiers",
    "parser, eligibility, segmentation and derivation version identifiers",
    "deterministic quality/completeness semantics",
    "manifests, checksums and immutable authority/day-seal provenance",
    "causal historical feature counts and weekday exposures",
    "recurrence scores, ranks, candidate and route identities",
    "shared-anchor snapshot indexing, capacity states and generation metadata",
    "prospective selection, truth-join outcomes and evaluation metadata"
  ],
  "excludedContents": [
    "FlightTrove user accounts",
    "user location",
    "favourites",
    "spot collections and notes",
    "billing and entitlements",
    "notification preferences",
    "partner or sponsor records"
  ],
  "steps": [
    {
      "order": 1,
      "id": "discover",
      "operation": "Discover ADSB.lol daily GitHub releases for the bounded UTC backlog."
    },
    {
      "order": 2,
      "id": "canonical-source",
      "operation": "Select one canonical source-day release/asset set under deterministic resolver and archive-safety preflight rules."
    },
    {
      "order": 3,
      "id": "verify-assets",
      "operation": "Persist release/asset provenance and verify selected source bytes by SHA-256."
    },
    {
      "order": 4,
      "id": "parse",
      "operation": "Parse per-aircraft readsb historical traces into normalized timestamped aircraft observations; count malformed and rejected points."
    },
    {
      "order": 5,
      "id": "coverage",
      "operation": "Retain observations relevant to the versioned EUROPE_V1 evidence coverage domain."
    },
    {
      "order": 6,
      "id": "eligibility",
      "operation": "Apply versioned historical observation eligibility and source-quality rules."
    },
    {
      "order": 7,
      "id": "segment",
      "operation": "Create deterministic aircraft flight segments from accepted observations."
    },
    {
      "order": 8,
      "id": "spatialize",
      "operation": "Project segment start/end positions to H3 resolution 5; retain observed H3 resolution-7 corridor cells, first-entry progress and altitude statistics, with a 512-unique-cell cap; derive each corridor cell's canonical H3 resolution-5 hierarchy parent with H3 cellToParentAddress rather than reprojecting the R7 cell center."
    },
    {
      "order": 9,
      "id": "aggregate-patterns",
      "operation": "Aggregate qualifying segments into ROUTE, AIRCRAFT_ROUTE and CALLSIGN_ROUTE evidence with first/last seen, altitude, duration, observation and source-class counters."
    },
    {
      "order": 10,
      "id": "aggregate-time",
      "operation": "Aggregate qualifying pattern evidence into hour-of-week bins 0 through 167."
    },
    {
      "order": 11,
      "id": "quality",
      "operation": "Compute deterministic day quality, source manifest, semantic fingerprint and day-delta checksum."
    },
    {
      "order": 12,
      "id": "persist",
      "operation": "Persist a one-day BOOTSTRAP_SCORING dataset only when production invariants pass; store exact R7 route-corridor evidence in bounded route-by-R5-parent packs and expose the unchanged logical row contract through the READY compatibility view; otherwise retain UNKNOWN gap/degraded semantics."
    },
    {
      "order": 13,
      "id": "seal",
      "operation": "Create one immutable regional historical truth day seal under REGIONAL_HISTORICAL_TRUTH_AUTHORITY_V1."
    }
  ],
  "persistentStructures": [
    "historical_bootstrap_datasets",
    "historical_bootstrap_days",
    "historical_bootstrap_assets",
    "historical_bootstrap_pattern_aggregates",
    "historical_bootstrap_hour_bins",
    "historical_bootstrap_route_corridor_aggregates",
    "historical_bootstrap_route_corridor_packs",
    "regional_historical_truth_authorities",
    "regional_historical_truth_day_seals"
  ],
  "qualitySemantics": {
    "complete": "READY one-day BOOTSTRAP_SCORING dataset with QUALIFIED source day and matching immutable authority provenance",
    "gap": "UNKNOWN evidence; never converted into a negative flight outcome",
    "degraded": "UNKNOWN evidence; never converted into a negative flight outcome"
  },
  "algorithm": {
    "scope": "RegionalHistoricalFeedMain -> RegionalHistoricalDailyMain, one-day EUROPE_V1 BOOTSTRAP_SCORING ingestion. Qualification-experiment HOLDOUT ledgers are not inputs to this production database. Documentation revision 5 introduced the compact PostgreSQL corridor representation. Documentation revision 7 corrects corridor pack parent identity to the canonical H3 hierarchy and versions the packed importer as v5. Documentation revision 9 adds advisory-lock-scoped cleanup of abandoned raw scratch before retrying an unsealed source day. Documentation revision 10 changes PostgreSQL ingest-time validation from duplicate full-row counts to qualified-source versus atomic stream-write counters and bounded READY-view existence checks; the persistent schema, produced derivative contents, source selection, exact R7 evidence, route/time aggregation, scoring and authority semantics remain unchanged. Documentation revision 11 introduces optional D-1 source release discovery for steady operation, never admitting processing before the unchanged D+1 six-hour authority-maturity boundary. Previously immutable sealed source days remain unchanged, and this scheduling change does not alter source asset selection, trace parsing, eligibility, segmentation, evidence content, fingerprint generation, P862 causal timestamps or provenance. The production reviewed policy binding remains at D-2 until a separate approved, publicly disclosed steady-mode promotion. Documentation revision 12 approves the bounded D-1 steady acquisition policy after separate deployment of the maturity-guarded worker. This policy does not modify any historical scoring, day-seal or P862 causal selection semantics; the production operator still must apply the reviewed D-1 environment configuration through the guarded steady promotion. Documentation revision 13 approves only the frozen regional P862 prospective SHADOW experiment (first causal as-of 2026-10-17T00:00:00Z, predeclared 28-day target window 2026-10-18 through 2026-11-14) using the exact frozen pipeline and regional truth-authority fingerprint, retaining public product materialization and exposure disabled. This review does not modify the frozen algorithm, historical truth, or data authority.",
    "sourceSelection": {
      "releaseVariant": "Case-insensitive tag classification: mlatonly/mlat-only before staging before prod; other tags, draft and prerelease releases are ineligible. The production feed does not use manual overrides.",
      "archiveFamily": "Exactly one unsplit .tar asset or one .tar.[a-z]{2} split family with contiguous suffixes starting at aa. Competing unsplit/split families, multiple families, missing parts or missing upstream SHA-256 are rejected. Sum selected asset byte sizes and apply inclusive configured minimum/maximum source-byte limits.",
      "canonicalRelease": "Among healthy PROD families select the unique largest byte total; otherwise do the same for STAGING. A tie is ambiguous and fails closed. Do not concatenate independent releases. Order selected assets by filename then asset ID; concatenate split bytes in that order.",
      "verification": "Verify exact byte size and SHA-256 against the immutable GitHub asset identity before parsing, including cached assets. Recovery uses the previously pinned source manifest, not a newly selected release. Before retrying an unsealed source day under the feed advisory lock, delete only that day's abandoned raw scratch; durable local state, prepared metrics, verified asset cache and persisted database evidence are preserved. Already sealed days are not re-imported. Transport failures remain retryable and do not seal negative evidence."
    },
    "archive": {
      "members": "Traverse tar order. Normalize backslashes to slashes; reject absolute paths, parent traversal and non-directory special members. Only regular members ending in traces/[0-9a-fA-F]{2}/trace_full_~?[0-9a-fA-F]{6}.json are parsed. Their payload is gzip despite the .json filename. Ignore other regular files and directories.",
      "maxTarEntries": 1000000,
      "maxCompressedTraceBytes": 8388608,
      "maxInflatedTraceBytes": 67108864,
      "maxTracePoints": 500000,
      "maxCarryAircraft": 250000,
      "failure": "Declared and actual member size must match; hard-bound, archive and whole-trace parse failures abort the day when the configured parse-failure allowance is exceeded. No partial day becomes READY."
    },
    "parser": {
      "requiredRoot": "Object with string icao, finite numeric timestamp (epoch seconds), and trace array. Trim/lowercase ICAO. Trim/uppercase r (registration) and t (type); these are transient parser metadata and are not aggregate subjects.",
      "tuple": "Each point is an array of at least seven items: [0] relative seconds, [1] latitude, [2] longitude, [3] base altitude in feet or ground, [4] ground speed in knots, [6] nonnegative integer flags, [8] optional detail object, [9] position-source string, [10] optional geometric altitude. Other tuple fields do not contribute to this derivative.",
      "timestamp": "Add relative seconds to base epoch seconds; floor whole seconds and round the remaining fraction to nanoseconds, carrying a rounded billion nanoseconds into the next second.",
      "callsign": "Carry the previous callsign within the trace; if detail.flight is present replace it with trimmed uppercase string, or null for missing/blank/non-string/>32-character content. Structurally malformed points are counted and skipped without changing callsign state.",
      "positionSource": "Trim/lowercase tuple[9]; missing stays unknown. detail.type is not a fallback.",
      "flags": {
        "stalePosition": 1,
        "newLeg": 2,
        "baseAltitudeGeometric": 8
      },
      "altitudePrecedence": "Ground is unusable. Otherwise take finite tuple[10], then finite base altitude when flag 8 is set, then finite detail.alt_geom, then finite numeric base altitude. No geometric/barometric correction is added.",
      "ordering": "Preserve archive and tuple order; do not sort points or merge different source releases. Whole-trace failures and malformed-point counts are recorded separately."
    },
    "eligibility": {
      "identity": "Exactly six lowercase hexadecimal ICAO characters; reject ~ identities.",
      "time": "Observation must fall on the selected UTC source date.",
      "coordinates": "Finite latitude in [-90,90] and longitude in [-180,180].",
      "positionSources": [
        "adsb_icao",
        "adsr_icao",
        "tisb_icao",
        "mlat"
      ],
      "stalePosition": "Reject flag 1.",
      "groundSpeed": "Absent allowed; if supplied must be finite and in [0,2000] knots.",
      "altitude": "Reject ground/missing/nonfinite altitude; require -2000 <= altitude <= 100000 feet and altitude > 0 before rounding.",
      "rounding": "Round accepted altitude and supplied ground speed using Java Math.round to integer units.",
      "coverage": "Compute H3 R5 and R7 from the point; accept only if R5 belongs to the published EUROPE_V1 coverage cell set."
    },
    "coverage": {
      "h3Implementation": "com.uber:h3:4.1.1 (H3 Java)",
      "geometryUrl": "https://flighttrove.app/open-data/europe-v1.polygons",
      "geometryLicense": "Natural Earth source coordinates are public domain; FlightTrove-added coverage contents are included under the derivative database's ODbL grant.",
      "format": "UTF-8; ignore blank/comment lines. P|label|lat,lon;... supplies an outer polygon ring without holes. A|label|lat,lon supplies a microstate anchor.",
      "operation": "Union H3 polygonToCells at resolution 5 for every published ring and latLngToCell at resolution 5 for every anchor, then union gridDisk(cell,1) for every base cell. These exact published coordinates, not a bounding rectangle or a contemporary Natural Earth download, define coverage.",
      "cellHash": "SHA-256 of UTF-8 coverageVersion followed by lexicographically sorted unique R5 cell IDs, each prefixed with its 4-byte big-endian byte length."
    },
    "segmentation": {
      "perAircraft": "Maintain carry by ICAO. Reject a timestamp earlier than the last accepted segment timestamp. At an equal timestamp add only distinct callsign evidence; do not increase observations, altitude or source counters, move endpoints or add corridor cells.",
      "splitPriority": [
        "new-leg flag",
        "timestamp >= segment start + 18 hours",
        "timestamp > previous timestamp + 20 minutes",
        "both nonnull callsigns differ",
        "haversine distance >20 nautical miles and implied speed >1200 knots (Earth radius 6371.0088 km; 1 NM=1.852 km)"
      ],
      "update": "For each strictly later point that does not split, increment observation/source count; update last position/R5 endpoint, min/max/sum/count of integer altitude, primary nonnull callsign and sorted distinct callsign evidence (retain first three). A split finalizes the previous segment and starts one at the new point.",
      "dayBoundary": "An initial segment without incoming carry whose first accepted point is before UTC 00:20 is boundary-truncated and excluded from aggregates. At next midnight finalize carries whose last point is at least 20 minutes old; the production one-day job discards remaining carry instead of contributing an unfinished segment. It does not join successive production days.",
      "duration": "Whole seconds between segment first and last timestamp; segment mean altitude is Math.round(sum of integer point altitudes / point count)."
    },
    "corridor": {
      "version": "p7-corridor-v1",
      "resolution": 7,
      "maximumUniqueCells": 512,
      "cells": "Retain distinct observed R7 cells in first-entry order, first-entry time, and per-cell point-altitude min/max/sum/count. Re-entry updates altitude statistics without moving the first-entry time. Do not interpolate a polyline or fill cells between observations.",
      "overflow": "On the 513th distinct cell discard the entire corridor, mark overflow, and contribute no partial corridor; coarse route-pattern and hour evidence remains valid.",
      "progress": "For each cell round 1000 * milliseconds(first-entry minus segment-start) / milliseconds(segment-end minus segment-start), clamp to [0,1000]; zero-duration segments use 0.",
      "aggregation": "Key by startR5/endR5/corridorR7; contribute once per distinct segment cell. Sum traversal count, first-entry progress, point-altitude sum and point-altitude count; merge altitude extrema. Materialize corridor_h3_r5 with the canonical H3 hierarchy operation cellToParentAddress(corridorR7,5). Do not reconstruct hierarchy identity by converting the R7 cell center back through latLngToCell.",
      "storage": "Persist exact corridor evidence grouped by dataset, coarse route and the canonical H3 resolution-5 parent of each corridor R7 cell. Each physical pack contains parallel typed arrays for at most the 49 H3 resolution-7 hierarchy children of one H3 resolution-5 parent. The READY compatibility view expands every pack back to one logical row per R7 cell, preserving start/end route, traversal, progress and altitude values exactly. Legacy row-per-cell datasets remain readable during migration and are not rewritten by Flyway. Database mutation guards require packed-corridor importer generations for pack writes and reject legacy corridor writes from those generations, so one dataset cannot contribute through both physical representations."
    },
    "patterns": {
      "keys": "ROUTE subject '-' and AIRCRAFT_ROUTE subject ICAO, both keyed by startR5/endR5. Add CALLSIGN_ROUTE only for exactly one distinct callsign matching [A-Z0-9][A-Z0-9-]{0,31}.",
      "statistics": "Each nontruncated finalized segment contributes one evidence and one qualified-evidence count per key; first/last seen are min/max of segment START timestamps. Merge altitude extrema, sum rounded segment means, count segment means, sum whole-second segment durations, sum observation counts and source-class point counts. The mean-altitude accumulator is segment-weighted, not point-weighted.",
      "hourBins": "One contribution per pattern/segment at UTC (ISO weekday-1)*24 + segment-start hour; Monday 00:00=0 and Sunday 23:00=167.",
      "holdout": "Production role is SCORING. EMBARGO and boundary-truncated segments contribute nothing. Qualification HOLDOUT segments and their ordered corridor children are separate internal evaluation data, not historical aggregate inputs."
    },
    "qualityAndPersistence": {
      "qualification": "Require at least one archive trace and configured minimum accepted points (default 1), within configured whole-trace parse-failure allowance (default 0). Preserve malformed/rejected/parsed/finalized counters. Load exact local aggregate keys and values atomically into PostgreSQL; route corridor cells are physically packed by route and R5 parent without aggregation loss, and logical cell cardinality is revalidated through the compatibility seam. Transition MANIFEST_LOCKED -> DERIVING -> STAGED -> READY. Store no raw tracks in this database.",
      "gap": "NO_RELEASE, NO_ARCHIVE_ASSETS, MLAT_ONLY_RELEASE and MANUAL_EXCLUSION yield GAP; other nonhealthy preflight states or terminal content/immutable-source failure yield DEGRADED. Both seal AUTHORITATIVE_INCOMPLETE and remain UNKNOWN, with no negative flight evidence.",
      "provenance": "Add deterministic dataset/pattern identities, source repository/day/release/tag/variant/asset order/name/size/upstream and verified SHA-256, source selection policy and manifest hashes, transformation versions, coverage hash, semantic fingerprint, day-delta checksum, quality/reason/counters, lifecycle/scoring/retention timestamps, immutable authority fingerprint and day-seal digest. Creation/load timestamps are execution-time metadata, not observations.",
      "authority": "Bind region canonical hash, coverage version/hash, provider/repository/license, importer/parser/archive/eligibility/segmentation/derivation, manifest/completeness/seal versions and configured maturity. A qualified day becomes causally available no earlier than both dataset readiness and next UTC midnight + maturity (default 6 hours); read-side creation timestamps also must precede asOf. UTC hours 0 and 23 are ineligible under the authority completeness policy.",
      "retention": "Scoring expiry is load time plus configured scoring retention (default 90 days; allowed 90..400). After expiry, bounded maintenance transitions BOOTSTRAP_SCORING datasets READY -> RETIRED -> EXPIRED and deletes heavy child evidence while retaining the immutable dataset metadata row and regional authority/day seal for audit/provenance. Raw scratch is deleted after each attempt; compact staging is removed after sealing unless explicitly retained. Verified upstream byte caching does not add new contents."
    },
    "configuration": {
      "policy": "These are source-controlled defaults, not evidence of the current VPS environment. Effective overrides affect source-day availability/qualification and must be covered by the deployed method and authority; credentials and absolute scratch/database paths are not dataset contents.",
      "sourceLagDays": 2,
      "backlogDays": 70,
      "maximumDaysPerRun": 2,
      "missingSourceFinalizationHours": 72,
      "minimumSourceBytes": null,
      "maximumSourceBytes": 12000000000,
      "maximumTraceParseFailures": 0,
      "minimumAcceptedPoints": 1,
      "maturityHours": 6,
      "scoringRetentionDays": 90
    }
  },
  "productBoundary": {
    "pipeline": "P862RegionalHistoricalPipeline",
    "authorityGeneration": "REGIONAL_HISTORICAL_TRUTH_AUTHORITY_V1",
    "notes": "Displayed T+24 forecasts are treated as Produced Works. The machine-readable offer conservatively includes the persistent source-derived downstream feature, scoring, candidate, selection and outcome layers as part of the ODbL derivative scope. Independent account, billing and user-event data are not supplied or licensed as historical contents. Weather, live sightings and personal relevance are read-time enrichment and do not rewrite the covered historical/forecast evidence tables."
  },
  "algorithmSupplement": {
    "url": "https://flighttrove.app/open-data/adsb-lol-historical-derivation-v1-algorithms.json",
    "format": "application/json",
    "role": "Normative supplement: exact source-text algorithm descriptions and SQL schemas, including parser/eligibility/segmentation, all checksum/UUID canonicalizations, downstream historical feature SQL, score math, ranking/selection, snapshot writes, truth joins and evaluation. Each file carries a SHA-256 and the package has a deterministic digest. This supplements, and where greater precision is needed takes precedence over, the prose summaries.",
    "inputs": "Upstream archive and GitHub release metadata; exact published coverage geometry; configured bounded policy parameters; selected source manifests; target/asOf UTC times; authority identity; execution timestamps and experiment/window identifiers. Product snapshots are a function of a requested H3 R5 anchor (an abstract spatial index), not account identifiers. The set of scheduled anchors is independent demand/scheduling data and is not needed to compute a snapshot for any specified anchor.",
    "additionalContents": "Exact coverage coordinates are supplied by geometryUrl. All other added historical/forecast contents are generated by the supplied algorithms from the stated inputs, including scores, identifiers, versions, counters, status and provenance. Raw archive bytes are not altered; caching and scratch management are included for clarity.",
    "configuration": "All supported policy parameters, defaults and constraints are in RegionalHistoricalFeedMain.Config, ArchiveSafetyLimits, GateBContentPolicy, P862ShadowProperties and ForecastProductMaterializationProperties in the supplement. Environment overrides are inputs to this parameterized method; they are not silently asserted to equal repository defaults. Credentials, host addresses and filesystem paths are transport/storage inputs, not additional historical contents."
  },
  "observedProductionPolicy": {
    "observedAt": "2026-10-04T20:48:07Z",
    "deployedRevision": "926092aca596c45414be0a9e07623a0c7e4ad602",
    "scope": "Read-only execution-parameter snapshot, not a claim that future configuration always equals these values. Exact supported overrides and defaults remain in the algorithm supplement. All 70 supplement files were hash-compared to this deployed image revision and matched.",
    "sourceLagDays": 2,
    "backlogDays": 70,
    "maxSourceDaysPerRun": 7,
    "finalizeMissingAfterHours": 72,
    "maxAssetAttempts": 2,
    "maxTransferBytes": 12000000000,
    "maxSourceBytes": 12000000000,
    "minSourceBytes": null,
    "maxTraceParseFailures": 0,
    "minAcceptedPoints": 1,
    "maturityHours": 6,
    "scoringRetentionDays": 400,
    "prospectiveInvocationLateness": "PT5M",
    "productMaxCandidatesPerAnchor": 4096,
    "productMaxActiveZones": 100000,
    "productMaxActiveAnchors": 100000,
    "publicProductExposure": "DISABLED",
    "productMaterializationEnabled": false,
    "prospectiveShadowEnabled": false
  },
  "downstreamDerivation": {
    "persistentStructures": [
      "p862_prospective_windows",
      "p862_shadow_invocations",
      "p862_hourly_candidates",
      "p862_hourly_diagnostics",
      "p862_shadow_predictions",
      "p862_daily_selections",
      "p862_shadow_outcomes",
      "p862_hourly_diagnostic_outcomes",
      "forecast_product_invocations",
      "forecast_product_hourly_candidates"
    ],
    "historicalFeatures": "At exact targetHour-24h, read matching-authority AUTHORITATIVE_COMPLETE seals and READY datasets whose seal readiness/creation precede asOf, within configured evidence retention. Sum route and qualified support across those days, hour support from the target UTC weekday-hour bin, and traversal support for each R7 corridor. Count qualified same-weekday days as exposures. Require route>=2, qualified=route, hour>=1 and corridor>=1. The exact SQL and branch-specific limits/order are in P862RegionalFeatureSource.",
    "score": "THINNED rate=(hourSupport*qualifiedSupport*corridorSupport)/(routeSupport^2*weekdayExposures); decimal division at scale 18 HALF_EVEN. Score=-StrictMath.expm1(-rate.doubleValue()), rounded to scale 10 HALF_EVEN. It is a ranking score, not a calibrated probability. RouteRateScore specifies all validation and numeric details.",
    "ordering": "Score descending, hour support descending, corridor support descending, candidate key ascending. routeKey=startR5+'>'+endR5; candidateKey=routeKey+'>'+corridorR7. The prospective branch limits coarse routes to 5000, corridor cells per route to 8, then retains the top three for diagnostics and top two for hourly selection. The product branch filters by requested anchor's R5 ring before feature transfer and includes the full bounded relevant universe, without prospective top-K truncation.",
    "sharedAnchor": "A snapshot is keyed by target hour, H3 R5 anchor and selection fingerprint. gridDisk(anchor,8) gives candidate coverage; corridor R5 is the canonical H3 resolution-5 hierarchy parent persisted for each R7 corridor cell and exposed through the compatibility seam. A successful materialization retains every unique matching candidate up to the configured cap (default/max 4096); overflow records CAPACITY_EXCEEDED with zero partial candidates. Generation is after asOf and before target; causal backfill still reads at the same historical asOf. No account ID or saved-zone ID is stored in these shared candidate tables.",
    "warmup": "Require registered matching authority and all 56 consecutive complete source days in [asOfUtcDate-57 days,asOfUtcDate-1 day), each one-day READY/QUALIFIED SCORING dataset known by asOf. Exact readiness queries are supplied.",
    "prospective": "Hourly top two are frozen at exact T-24; after the last causal hourly invocation, daily ROUTE_ROUND_ROBIN selects at most five from the 48-slot hourly pool. Per-route and round-head order follow the supplied comparator. Window, invocation, diagnostic, candidate, daily-selection and prediction identities, metadata and hashes follow P862ShadowRepository and P861DailySelectionPolicy.",
    "outcomes": "Join predictions/diagnostics to matching sealed historical target days. Gap/degraded evidence is UNKNOWN; UTC hours 0/23 and ambiguous/overflow corridor pairings are ineligible, not false negatives. Exact positive/negative/unknown rules, matching identity and timestamp fields are in P862TruthJoinService. P862ProspectiveEvaluator and P862ProspectiveReportService specify derived metrics and report construction.",
    "legacyAndQualification": "The supplement also supplies the historical qualification/HOLDOUT and legacy forecast/model SQL schemas to make older persisted structures explicit. These schemas alone do not establish an active public data path. Current production writes are the daily importer and the downstream classes enumerated above; unsupported older processing must not be represented as covered by this generation.",
    "independentUserEvents": "Account, billing, subscriptions, favourites, spotting zones, confirmed user Spots and personal exposure/measurement events are separate independent databases. Their event times, audience pseudonyms, user identities and demand schedule are not historical evidence inputs. Referenced forecast candidate IDs/hashes/spatial identities retain their source-derived provenance and can be generated from the supplied covered candidate method. No right to personal data or disclosure of user-event records is granted."
  },
  "access": {
    "odblSection46Option": "method-of-alterations",
    "authenticationRequired": false,
    "internetPrice": 0,
    "format": "application/json"
  },
  "transformationIdentity": {
    "coverageRegion": "EUROPE_V1",
    "coverageVersion": "europe-v1-ne110m-admin0-r5-buffer1-v1",
    "coverageGeometryProvenance": "natural-earth-ne110m-admin0-europe-union-v1",
    "coverageGeometrySha256": "20b8eaffe91ce2eaab297708467d7cc6ec0957561597ecfc4113f61bf1d63b67",
    "h3Resolution": 5,
    "borderBufferRings": 1,
    "importerVersion": "p7-postgres-loader-v5-packed-corridors",
    "parserVersion": "readsb-trace-v2-globe-history-json",
    "archiveSafetyProfile": "p7-archive-safety-v2|maxTarEntries=1000000|maxCompressedTraceBytes=8388608|maxInflatedTraceBytes=67108864|maxTracePoints=500000|maxCarryAircraft=250000",
    "eligibilityVersion": "p7-source-eligibility-v1",
    "segmentationVersion": "p7-seg-v1",
    "derivationVersion": "p7-day-delta-v2-corridor",
    "sourceManifestPolicyVersion": "P7_SOURCE_MANIFEST_SCHEMA_V1_DAY_SHA256_V1",
    "completenessSemanticsVersion": "QUALIFIED_REGION_SOURCE_DAY_BOUNDARY_HOURS_INELIGIBLE_V1",
    "sealSemanticsVersion": "IMMUTABLE_DIGEST_SEAL_READY_AT_MAX_SOURCE_MATURITY_AND_CREATION_V1",
    "authorityGeneration": "REGIONAL_HISTORICAL_TRUTH_AUTHORITY_V1"
  },
  "releaseGate": {
    "schemaVersion": 1,
    "reviewedAlgorithmPackageSha256": "e170ff79aa946d4864bd265fe18186f99ca4e20739a196e2d59797d434a44876",
    "policyBindings": [
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_REGION_ID",
        "approvedValue": "EUROPE_V1"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_SOURCE_LAG_DAYS",
        "approvedValue": "1"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_BACKLOG_DAYS",
        "approvedValue": "70"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_FINALIZE_MISSING_AFTER_HOURS",
        "approvedValue": "72"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MAX_ASSET_ATTEMPTS",
        "approvedValue": "2"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MAX_TRANSFER_BYTES",
        "approvedValue": "12000000000"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MAX_SOURCE_BYTES",
        "approvedValue": "12000000000"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MIN_SOURCE_BYTES",
        "approvedValue": ""
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MAX_TRACE_PARSE_FAILURES",
        "approvedValue": "0"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MIN_ACCEPTED_POINTS",
        "approvedValue": "1"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_MATURITY_HOURS",
        "approvedValue": "6"
      },
      {
        "service": "regional-historical-worker",
        "environment": "REGIONAL_HISTORICAL_SCORING_RETENTION_DAYS",
        "approvedValue": "90"
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_INVOCATION_LATENESS",
        "approvedValue": "PT5M"
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_ENABLED",
        "approvedValue": "true"
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_AUTHORITY_GENERATION",
        "approvedValue": "REGIONAL_HISTORICAL_TRUTH_AUTHORITY_V1"
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_PIPELINE_FINGERPRINT",
        "approvedValue": "4c29d016c47f036e7fdecaa2a28eeb3606c54d18b18ecfe9692e437c56a3792a"
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_TRUTH_AUTHORITY_FINGERPRINT",
        "approvedValue": "2ddd375fefc6d6f813515dc548b87d89fc4067b9c261217a9315215148298597"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_MATERIALIZATION_ENABLED",
        "approvedValue": "false"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_MAX_CANDIDATES_PER_ANCHOR",
        "approvedValue": "4096"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_MAX_ACTIVE_ZONES",
        "approvedValue": "100000"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_MAX_ACTIVE_ANCHORS",
        "approvedValue": "100000"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_EXPOSURE",
        "approvedValue": "DISABLED"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_PUBLIC_ACTIVATION_APPROVED",
        "approvedValue": "false"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_PUBLIC_ACTIVATION_EVIDENCE_FINGERPRINT",
        "approvedValue": ""
      },
      {
        "service": "truth-model",
        "environment": "P862_SHADOW_EVIDENCE_RETENTION",
        "approvedValue": "P90D",
        "default": "P90D"
      },
      {
        "service": "truth-model",
        "environment": "FLIGHTTROVE_FORECAST_PRODUCT_RETENTION",
        "approvedValue": "P3D",
        "default": "P3D"
      }
    ],
    "policyChangeRule": "Production deploy is blocked if the public method, exact algorithm/schema package or effective generation policy differs from the release contract. Review changes and publish the method before deploying. This is a deployment guard, not a prohibition on ODbL reuse. Transport credentials, storage paths, private audience IDs and performance-only scheduling controls are not published or compared as historical contents."
  },
  "algorithmPackageSha256": "e170ff79aa946d4864bd265fe18186f99ca4e20739a196e2d59797d434a44876"
}
