{
  "$schema": "https://nkodatalabs.com/catalog.json",
  "generated_at": "2026-09-07T15:14:07Z",
  "catalog_version": "1.11.1",
  "note_for_agents": "Machine-readable single source of truth for NKO Data Labs' products. If this ever disagrees with a product page or /llms.txt, this file and the live API are authoritative - the HTML pages are presentation, not the source of record. null means genuinely not measured/decided yet, never a placeholder for 0 or 'unknown but probably fine'.",
  "api_base": "https://api.nkodatalabs.com",
  "openapi": "https://api.nkodatalabs.com/openapi.json",
  "mcp_server": "https://api.nkodatalabs.com/mcp",
  "purchase_policy": "No autonomous purchasing is implemented or planned on the buyer side of this catalog - every purchase/checkout endpoint listed below requires an explicit human action (email + form submit + Stripe payment page), and physical_change additionally requires an explicit confirm-AOI step before any charge. Agents should surface these endpoints to a human, not call them to spend money unattended.",
  "products": [
    {
      "product_id": "find_missing",
      "name": "find_missing",
      "task": "Does this LEI-holding entity have a high-confidence match in the national commercial registry its own declared jurisdiction would expect?",
      "status": "LIVE",
      "gate": "PASS",
      "input_schema": {
        "identifier_type": "lei | company_number | name",
        "identifier": "string, 2-300 chars",
        "jurisdiction": "ISO-3166 alpha-2 country code, optional",
        "vat_number": "string, optional - GLEIF's LEI record carries no VAT number (verified live against a real record), so a real VIES cross-check is only possible if the caller supplies one"
      },
      "output_schema": {
        "entity_seen_in": "[{registry, id, matched_on, confidence}]",
        "expected_in": "[{registry, reason}]",
        "not_found_in": "[{registry, confidence, searched_at, evidence}]",
        "candidates": "[{lei, legal_name, country, matched_on}] - only populated for identifier_type=name, never auto-picks one",
        "verdict": "CONSISTENT | NO_HIGH_CONFIDENCE_MATCH | AMBIGUOUS_NEEDS_DISAMBIGUATION | null",
        "method_version": "string",
        "evidence_refs": "[string]",
        "additional_registries": "[{source, status, ...}] - independent cross-checks beyond GLEIF, first 4 sources (2026-09-03): SIRENE (France, direct query against recherche-entreprises.api.gouv.fr, no auth) when jurisdiction=FR; TED (EU public procurement full-text search, no auth) always attempted, presence-only signal, absence never treated as evidence; VIES (EU VAT validation) when vat_number is supplied, 28 real countries covered (GB excluded post-Brexit, verified live); Companies House (UK) when jurisdiction=GB, live since 2026-09-04 (API key registered) - verified live against Tesco PLC, status='confirmed'.",
        "verdict_block": "{verdict, confidence, declared_state, observed_state, delta, sensor_agreement, evidence, recommended_next_action} - standard envelope over the fields above. confidence reuses the same fixed real weights already used to build entity_seen_in/not_found_in (GLEIF self-record=1.0, national-registry cross-reference via GLEIF's RA code=0.95, absence assertion=0.6) - these are declared match-type weights, not a per-instance statistical measurement, and are documented as such, never presented as more precise than they are. sensor_agreement is now real ('agreement'/'disagreement'/'not_applicable_single_source') when a SIRENE or Companies House cross-check actually ran - verified live 2026-09-03 against real Carrefour (FR): GLEIF's own RA-code check said NO_HIGH_CONFIDENCE_MATCH (validated against Infogreffe/RCS, not SIRENE proper), but the independent SIRENE cross-check confirmed the SIREN is real, active and name-matched - real corroborating value GLEIF alone didn't provide."
      },
      "coverage": {
        "jurisdictions": 23,
        "jurisdictions_url": "https://nkodatalabs.com/products/find-missing/jurisdictions/",
        "source": "GLEIF (api.gleif.org), live lookups only, no cache of registry data itself"
      },
      "pricing": {
        "free_tier": {
          "calls_per_day_no_key": 5,
          "calls_per_day_with_key": 50,
          "endpoint": "POST /v0/keys",
          "note": "5 calls/day/IP with no key at all (anonymous trial, added 2026-09-05); 50/day with a free key, shared with /v0/company_state and /v0/award_state"
        },
        "paid": {
          "unit": "credit_pack",
          "calls_per_pack": 2500,
          "price": 19.0,
          "currency": "EUR",
          "recurring": false
        }
      },
      "purchase": {
        "endpoint": "POST /v0/checkout",
        "requires": [
          "api_key"
        ]
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "hard_rule": "Never asserts illegality, fraud or a shell entity - only 'no high-confidence match', always paired with the expectation rule that explains why a match was expected."
      },
      "sla": null,
      "expected_confidence": null,
      "confidence_note": "No aggregate accuracy figure (e.g. false-positive rate against a labeled benchmark) exists for this product as a whole. Each result now carries a real per-result confidence in verdict_block (0.95/1.0/0.6/null) derived from the fixed real match-type weights the method already used internally - not a new invented number, and not a statistically measured one either.",
      "mcp_tool": {
        "available": true,
        "server": "https://api.nkodatalabs.com/mcp",
        "transport": "streamable-http"
      },
      "planned_upgrades": [
        "4 cross-reference sources (SIRENE/TED/VIES/Companies House) built 2026-09-03, all 4 confirmed live 2026-09-04 - this confirmation layer is frozen at these 4 by owner decision ('se prueba pero no se paga, no invertimos mas ahi hasta ver uso repetido real'), separate from the 23-jurisdiction expectation-rule list (coverage.jurisdictions) which is a different, already-complete component.",
        "Reposition messaging away from 'cheap KYB' (Didit does more for ~$2) toward 'cross-registry expectation anomaly' - copy change, not built into this catalog entry yet."
      ],
      "method_version": "nko-find-missing-v0.1-2026-08-31"
    },
    {
      "product_id": "award_counterparty_state",
      "name": "award_counterparty_state",
      "task": "Given a real, awarded EU public-procurement notice (TED), is the winning company still alive today - active, dissolved, in insolvency proceedings?",
      "status": "LIVE",
      "status_note": "Re-activated 2026-09-10 (owner decision) in all 4 countries (ES, FR, GB, HU) after being paused 2026-09-07 - a precision test (comparing output against independently-verified ground truth, not just the source the product already queries) found 3 real confirmed cases out of 38 real TED awards where the product reported a confident 'confirmed' active status while attributing it to the wrong company (a syntactically valid but incorrect identifier resolved to an unrelated business). Root-cause fix deployed same day - re-running the same 38 real cases + 15 known-active controls came back clean in all 4 countries (0 identity errors, 17/17 new tests, 107/107 full find-missing-api suite). Full detail: experiments/reality_gap_test/candidate_05_award_counterparty_state/result.md",
      "gate": "PASS",
      "input_schema": {
        "notice_id": "string - a real TED publication-number of an AWARD notice (can-standard/can-social/can-desw/can-defence) with a chosen winner, e.g. '15-2026', not the original contract notice"
      },
      "output_schema": {
        "buyer": "{name, country}",
        "winner": "{name, country, identifier} - identifier is whatever TED's own winner-identifier field carries (a national tax/company ID in most cases, sometimes a foreign or non-standard reference)",
        "registry_status": "{source, status, real_name, active, ...} - status is one of: resolved/confirmed (ES/FR), not_found, excluded_natural_person, unparseable_identifier, country_not_covered, no_free_api (HU), not_configured",
        "method_version": "string",
        "evidence_refs": "[string]"
      },
      "coverage": {
        "countries_live_today": [
          "ES",
          "FR",
          "GB"
        ],
        "countries_not_covered": [
          "HU - no real free public API exists for Hungary's company registry, verified live 2026-09-05"
        ],
        "real_resolution_rate": "ES 65% (13/20 real companies, 5 natural persons excluded), FR 72% (18/25), GB 32% (7/22, excludes a known multi-lot artifact) - measured live on a real 25-per-country sample of the last 12 months, published in full at products/find-missing-api/award_counterparty_state_resolution_rate.md, not hidden",
        "known_limitation": "Some TED notices award multiple lots to winners from different countries; this v0.1 only resolves the first winner in TED's own array."
      },
      "pricing": {
        "free_tier": {
          "calls_per_day_no_key": 5,
          "calls_per_day_with_key": 50,
          "endpoint": "POST /v0/keys",
          "note": "shared quota with find_missing/company_state"
        },
        "paid": {
          "unit": "credit_pack",
          "calls_per_pack": 2500,
          "price": 19.0,
          "currency": "EUR",
          "recurring": false,
          "note": "same shared credit pack as find_missing"
        }
      },
      "purchase": {
        "endpoint": "POST /v0/checkout",
        "requires": [
          "api_key"
        ],
        "note": "Live and billable since 2026-09-10 (re-activated after the 2026-09-07 pause)."
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "hard_rule": "Never asserts fraud, illegality, or bid-rigging - only the winning company's real registry status today, with the exact source and evidence."
      },
      "sla": null,
      "expected_confidence": null,
      "mcp_tool": {
        "available": true,
        "server": "https://api.nkodatalabs.com/mcp",
        "transport": "streamable-http",
        "tool_name": "award_state"
      },
      "planned_upgrades": [
        "GB resolution rate (32%) could rise by handling more of the non-standard identifier formats TED sometimes carries in winner-identifier for UK winners.",
        "HU needs either a web-scraper for e-cegjegyzek.hu's search (real engineering work, not done) or the paid certified service (blocked by the project's zero-spend rule) - no code fix will cover it.",
        "Apify actor (pay-per-result, same engine) prepared but not published - needs the owner's own Apify account."
      ],
      "method_version": "nko-award-counterparty-state-v0.1-2026-09-05"
    },
    {
      "product_id": "license_drift",
      "name": "license_drift",
      "task": "Has this dataset's or API's declared license/terms text actually changed since we last checked?",
      "status": "LIVE",
      "status_note": "Confirmed live 2026-09-04: restricted Stripe key now has Subscriptions Read+Write (GET /v1/subscriptions/{id} succeeds; DELETE on a nonexistent id returns resource_missing, not a permission error - real proof write access works). The real €1 production test subscription (sub_1UBW24F8fB1QUeXUtGR0B2qP) was already canceled and its charge already refunded (verified against real Stripe data, ch_3UBW21F8fB1QUeXU2dAsrkKU, refunded=true) - the cancel action itself predates this permission fix, but the full pay->subscribe->cancel->refund lifecycle is confirmed real and clean. Local orders.sqlite3 synced to match (was stale at status=active).",
      "gate": "PASS",
      "input_schema": {
        "email": "string",
        "sources": "[string], 1-25 items (Hugging Face dataset URL or org/dataset id today)",
        "webhook_url": "string, optional - POSTed a real drift alert when detected, v0 has no email delivery yet"
      },
      "output_schema": {
        "dataset_id": "string",
        "status": "drift_detected | unchanged | fetch_error | baseline_captured",
        "terms_hash": "string, sha256 of the canonical terms snapshot",
        "checked_at": "ISO 8601 timestamp",
        "drift_count": "integer",
        "first_seen": "ISO 8601 timestamp - when NKO started watching this source",
        "last_known_safe": "ISO 8601 timestamp, only on drift_detected - last check before this change",
        "severity": "CRITICAL | HIGH | MEDIUM | LOW | null (null when no structured diff is available for this specific drift - see changes_note)",
        "changes": "[{field, old_value, new_value, severity, machine_action}] - per-field diff, only on drift_detected. field is e.g. 'cardData.license', 'gated', 'disabled', 'tags:license'. Empty with changes_note set if the previous snapshot predates structured diffing.",
        "changes_note": "string, only present when changes could not be computed (drift detected via hash but no prior structured snapshot to diff against)"
      },
      "coverage": {
        "watched_sources_today": 7,
        "max_sources_per_subscription": 25,
        "source_types_supported_today": [
          "Hugging Face dataset card"
        ],
        "source_types_planned": [
          "ModelScope",
          "Kaggle",
          "GitHub",
          "API terms-of-service URL",
          "custom license URL"
        ]
      },
      "pricing": {
        "paid": {
          "unit": "subscription",
          "price": 19.0,
          "currency": "EUR",
          "period": "month",
          "recurring": true
        }
      },
      "purchase": {
        "endpoint": "POST /v0/license-drift/checkout",
        "requires": [
          "email",
          "sources"
        ]
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "description": "Subscription, cancel anytime - not a customer-initiated return."
      },
      "sla": {
        "check_cadence": "daily"
      },
      "expected_confidence": null,
      "confidence_note": "Drift detection itself is hash-based (exact text change), not a confidence score - a change either flips the hash or it doesn't. Severity (CRITICAL/HIGH/MEDIUM/LOW) is a real, deterministic classification of WHICH field changed (disabled/private=CRITICAL, gated or license=HIGH, other metadata=MEDIUM, tags=LOW) - not a probabilistic confidence, and never inferred cause or intent. No false-positive/false-negative rate has been measured against a labeled benchmark yet.",
      "mcp_tool": {
        "available": false
      },
      "evidence_archive": "Every watch cycle now archives a dated JSONL snapshot of every watched source (not just on drift) - starting 2026-09-03, cannot be reconstructed for earlier dates.",
      "planned_upgrades": [
        "Source types beyond Hugging Face dataset cards (ModelScope, Kaggle, GitHub, API terms-of-service URL, custom license URL) - not built yet.",
        "Structured diff (changes[]) is only available for drifts detected after 2026-09-03 - a hash-drift against a pre-existing baseline captured before that date has severity=null and changes=[] with changes_note explaining why, honestly, not silently."
      ],
      "method_version": null
    },
    {
      "product_id": "physical_change",
      "name": "physical_change",
      "task": "How much did the physical volume of this site actually change between two real LiDAR/satellite epochs?",
      "status": "LIVE",
      "gate": "PASS",
      "input_schema": {
        "email": "string",
        "lat": "float, -90 to 90",
        "lon": "float, -180 to 180",
        "confirmed_aoi": "bool, required true - set after reviewing the real AOI/epochs returned by coverage-check",
        "epoch_a_hint": "string, optional",
        "epoch_b_hint": "string, optional"
      },
      "output_schema": {
        "verdict": "CHANGE_CONFIRMED | NO_CHANGE_CONFIRMED | DETECTED_BUT_TOO_UNCERTAIN_TO_ACT_ON | INCONCLUSIVE_NO_DATA | INCONCLUSIVE_LOW_DATA_QUALITY | INCONCLUSIVE_ALIGNMENT_FAILURE",
        "confidence": "float 0.0-1.0, or null for any INCONCLUSIVE_* verdict - never a fabricated number when there's no real result to score",
        "declared_state": "string - epoch A (reference/baseline)",
        "observed_state": "string - epoch B (current)",
        "delta": "{volume_change_m3, uncertainty_m3, unit} or null",
        "sensor_agreement": "{status, note} - honestly 'not_applicable_single_sensor' today (LiDAR vs LiDAR, no second independent sensor)",
        "evidence": "[{source, nominal_date, dates_independently_verified, n_ground_points, hash (null today, real gap), method_version, uncertainty_m3, rights, measured_at}]",
        "recommended_next_action": "string",
        "raw_measurement": "the full unmodified measure_physical_change() output (volume_change_m3, uncertainty_m3, usable_coverage_pct, n_stable_control_cells, stable_control_offset_m, stable_control_sigma_m, classification, evidence_refs, ...) - nothing is hidden, the envelope adds fields, it doesn't replace them"
      },
      "coverage": {
        "aoi_shape": "200x200m square centered on the given lat/lon - NOT a customer-drawn polygon in the on-demand flow (a real custom polygon is possible via the request-access path, not automated)",
        "regions": {
          "USA": {
            "precision": "POINT_IN_POLYGON_REAL against the public hobuinc/usgs-lidar index, real project names + years returned before payment"
          },
          "Spain": {
            "precision": "COUNTRY_LEVEL_CLAIM (PNOA-LiDAR national coverage), not a point-level intersection - exact flight dates confirmed during measurement, not before payment"
          }
        },
        "validated_sites": 4,
        "sites_measured_total": 536,
        "sites_with_result": 392,
        "sites_honest_calibration_failure": 144,
        "sites_url": "https://nkodatalabs.com/products/physical-change/sites/",
        "sites_carry_verdict_block": true
      },
      "pricing": {
        "free": {
          "scope": "536 published site pages (392 with a result, 144 honest failures), free forever"
        },
        "paid": {
          "unit": "measurement",
          "price": 149.0,
          "currency": "EUR",
          "recurring": false
        }
      },
      "purchase": {
        "endpoint": "POST /v0/physical-change/checkout",
        "requires": [
          "email",
          "lat",
          "lon",
          "confirmed_aoi=true"
        ],
        "precondition": "POST /v0/physical-change/coverage-check first - never charged without confirmed real coverage"
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "description": "Digital on-demand measurement - coverage verified and AOI/epochs confirmed by the customer before any charge; automatic refund if the measurement fails the quality threshold or the process errors."
      },
      "sla": {
        "delivery_target_hours": "48-72"
      },
      "quality_thresholds": {
        "coverage_pct_min": 50,
        "n_stable_control_cells_min": 200,
        "sigma_m_max": 1.0,
        "offset_m_max": 2.0,
        "frozen_before_first_site": true
      },
      "expected_confidence": null,
      "confidence_note": "Validated 4/4 on real sites with frozen thresholds (a 5th, Pasco County FL, genuinely failed and is recorded as a failure). No single aggregate accuracy number exists for the product as a whole - but each individual measurement now returns its own real per-result confidence (0.0-1.0, derived from the same uncertainty_to_change_ratio threshold the method already uses to decide DECISION_USEFUL vs AMBIGUOUS, never a fabricated score) as part of the verdict block.",
      "mcp_tool": {
        "available": false
      },
      "planned_upgrades": [
        "Sensor escalation ladder as a single verify(asset, minimum_confidence=X) call: L0 documentary -> L1 Sentinel/SAR/VIIRS -> L2 LiDAR/multisensor (this product, today) -> L3 commercial imagery (Planet/Maxar, last resort, pricing researched but not activated). Not built yet - today this product IS the L2 step, called directly.",
        "Cryptographic hash of the source point cloud per evidence item - not computed today (evidence[].hash is null), a real declared gap."
      ],
      "method_version": "measure_physical_change (unmodified core function across all 4 validated sites)",
      "distribution": [
        "https://www.kaggle.com/datasets/nkodatalabs/nko-physical-change-lmop-v0-1",
        "https://doi.org/10.5281/zenodo.22283729"
      ],
      "distribution_note": "The URLs above are the LMOP mass-batch subset (530 of the 536 published site pages - see README at each mirror for the exact reconciliation), not a mirror of the full live site."
    },
    {
      "product_id": "landfill_reality_delta",
      "name": "landfill_reality_delta",
      "task": "Cross what a public program declares about a landfill's fill rate against what an independent physical sensor actually measures, and report the delta honestly - including the sensor's own blind spots.",
      "status": "LIVE",
      "status_note": "Published 2026-09-04. Real cross between EPA LMOP's declared annual waste-acceptance rate and NKO's own measure_physical_change() LiDAR volume-change measurements, for 330 real US landfills. Central finding, stated as such (not buried as a caveat): surface LiDAR has a real, now-quantified blind spot - it cannot see waste filling an excavated cell before that cell reaches original ground level, which is standard practice under US Subtitle D landfill regulation. 3 individually documented site-level cases included (1 confirms, 1 supports, 1 explicitly ruled out as a different real phenomenon - subsurface smoldering/subsidence at Bridgeton LF, MO). Preregistered methodology and control group (47 closed sites, passed) - fixed before any delta was computed.",
      "gate": "PASS",
      "input_schema": null,
      "output_schema": {
        "format": "CSV + JSONL, one row per site: declared mass, observed volume change, delta under two density scenarios, honest per-site label (CONSISTENT_WITH_DECLARED / UNRESOLVED_SIGNAL_BELOW_DECLARED / UNRESOLVED_SIGNAL_ABOVE_DECLARED - never 'discrepancy' or 'material', because the tonnes-to-m3 conversion is a cited density range, not a measured constant)"
      },
      "coverage": {
        "sites": 330,
        "control_sites": 47,
        "source_declared": "EPA LMOP directory (Annual Waste Acceptance Rate)",
        "source_observed": "NKO measure_physical_change(), same unmodified function used across the whole physical_change product line"
      },
      "pricing": {
        "free": {
          "scope": "entire dataset"
        }
      },
      "purchase": {
        "endpoint": null,
        "note": "No checkout - direct download."
      },
      "rights": {
        "license": "CC-BY 4.0",
        "attribution_required": true
      },
      "distribution": [
        "https://nkodatalabs.com/pipeline/landfill-reality-delta/",
        "https://www.kaggle.com/datasets/nkodatalabs/nko-landfill-reality-delta-lmop-v0-1",
        "https://doi.org/10.5281/zenodo.22306129"
      ],
      "sla": null,
      "expected_confidence": null,
      "confidence_note": "No single aggregate confidence number - the dataset's own central finding is a real methodological limitation of the observed-side sensor, disclosed as such rather than smoothed over with a confidence score.",
      "mcp_tool": {
        "available": false
      },
      "planned_upgrades": [
        "Site-specific density data (today a cited EPA AP-42 range, not measured per site) would narrow the delta range - not built.",
        "Extending documented-case verification (today 3 of ~8 candidates investigated) beyond the initial batch - not started."
      ],
      "method_version": "nko-landfill-reality-delta-lmop-v0-1-2026-09-04"
    },
    {
      "product_id": "verified_negatives",
      "name": "verified_negatives",
      "task": "Give me a labeled benchmark of real stable-ground (no-change) polygons to test a change-detection model against.",
      "status": "LIVE",
      "gate": "PASS",
      "input_schema": null,
      "output_schema": {
        "format": "GeoJSON polygons + metadata, see Hugging Face dataset card"
      },
      "coverage": {
        "polygons": 50,
        "region": "Ibiza, Spain",
        "campaigns": "2 independent PNOA-LiDAR campaigns (2019/2024)",
        "planned_scale": "500-5,000 polygons across multiple countries/LiDAR programs/surface types - not started, future work when time allows"
      },
      "pricing": {
        "free": {
          "scope": "entire dataset"
        }
      },
      "purchase": {
        "endpoint": null,
        "note": "No checkout - direct download."
      },
      "rights": {
        "license": "CC-BY 4.0",
        "attribution_required": true
      },
      "distribution": [
        "https://huggingface.co/datasets/NKODATALABS/verified-negatives-canaputxa",
        "https://www.modelscope.ai/datasets/NKODATALABS/verified-negatives-canaputxa",
        "https://www.kaggle.com/datasets/nkodatalabs/verified-negatives-canaputxa",
        "https://doi.org/10.5281/zenodo.22283715"
      ],
      "sla": null,
      "expected_confidence": null,
      "confidence_note": "Not applicable - this product IS the calibration/benchmark data, not a verdict.",
      "mcp_tool": {
        "available": false
      },
      "planned_upgrades": [
        "evaluate_model(model_output) endpoint: returns false_positive_rate against this benchmark - turns this from a free lead magnet into evaluation infrastructure. Not built yet."
      ],
      "method_version": null
    },
    {
      "product_id": "china_industrial_reality",
      "name": "china_industrial_reality",
      "task": "Per Chinese industrial asset announced in Europe: is it actually being built/operating, with evidence - not just a company database.",
      "status": "NOT_FOR_SALE",
      "gate": "BLOCK",
      "gate_reason": "Physical-measurement method (satellite) validated on unrelated real sites, but zero of the tracked candidate assets has a MEASURED (independent physical) result yet - dead on the real candidate parcels themselves (Debrecen/Szeged). A second, non-physical method (municipal/regulatory activity + factory-specific construction contracts + employment, never conflated with park-infrastructure contracts) was blind-tested 5/5 on independent cases and is now populated with real, sourced evidence for all 13/13 catalog assets (see regulatory_signal field on each asset page/JSON) - still DOCUMENTED-tier evidence, not a physical MEASURED delta, so the commercial gate stays BLOCK pending an explicit owner decision on whether this second method should open it.",
      "input_schema": null,
      "output_schema": null,
      "coverage": null,
      "pricing": null,
      "purchase": {
        "endpoint": null,
        "note": "Request access via email form on the product page - no checkout exists."
      },
      "rights": null,
      "sla": null,
      "expected_confidence": null,
      "confidence_note": "Not applicable - not for sale.",
      "mcp_tool": {
        "available": false
      },
      "planned_output_vocabulary": [
        "ANNOUNCED",
        "PERMITTED",
        "BUILT",
        "OPERATING",
        "CAPACITY",
        "CHANGE_RATE",
        "IMPORT_SIGNAL",
        "PHYSICAL_SIGNAL",
        "REALITY_DELTA"
      ],
      "planned_output_vocabulary_note": "Naming convention decided for when the Buildout Ledger (see pipeline items below) produces a publishable result - aligns with the DECLARED vs PHYSICAL vs FLOWS framing already in use. Not live output yet.",
      "method_version": null
    },
    {
      "product_id": "patent_reality_check",
      "name": "NKO Reality Check #001 — Patent legal state",
      "task": "Does Google Patents' displayed legal status for this US patent match what the USPTO's own Official Gazette has already confirmed (expiration for non-payment of maintenance fees)?",
      "status": "LIVE",
      "gate": "PASS_PUBLISHED",
      "input_schema": {
        "patent_number": "string, US patent number, e.g. '8727430' or 'US8727430' (kind code guessed automatically: B2/B1/A1/A/S1)"
      },
      "output_schema": {
        "patent_number": "string, normalized",
        "reported_state": "{source: 'Google Patents', value, url, filing_date, grant_date, anticipated_expiration, disclaimer} | null if fetch failed",
        "reported_error": "string | null - 'not_found_on_google_patents' or a fetch error, never silently mapped to a state",
        "nko_state": "{source: 'USPTO Official Gazette...', value: ACTIVE|EXPIRED|UNKNOWN, reason, official_evidence, expired_on, issue_date} - UNKNOWN when the patent is not confirmed lapsed in NKO's ingested Gazette window, never forced to ACTIVE",
        "mismatch": "bool | null - true only when reported_state shows Active/... while nko_state is EXPIRED with real Gazette evidence",
        "confidence": "1.0 when nko_state=EXPIRED (binary match against a primary official source), null otherwise",
        "confidence_basis": "'observed_primary_source' | 'unknown'",
        "checked_at": "ISO8601 UTC",
        "corpus_coverage": "{weeks_covered, total_records} - real size of the ingested USPTO Gazette window at query time"
      },
      "coverage": {
        "jurisdictions": 1,
        "jurisdictions_note": "US utility/design/plant patents only - error type covered is maintenance-fee non-payment specifically, not litigation, assignments, or non-US jurisdictions",
        "corpus_records": 179840,
        "corpus_weeks": 52,
        "source": "USPTO Official Gazette (uspto.gov/web/offices/com/sol/og), weekly Notice of Expiration of Patents Due to Failure to Pay Maintenance Fee - refreshed weekly, live cross-check against Google Patents (patents.google.com) per query"
      },
      "pricing": {
        "free_tier": {
          "single_check": "unlimited, no account",
          "batch": "up to 50 patents per request, no account"
        },
        "paid": {
          "unit": "batch",
          "max_patents_per_batch": 5000,
          "price": 999.0,
          "currency": "EUR",
          "recurring": false,
          "delivery": "within 24-48h, downloadable results with official USPTO evidence link + verification date per patent"
        }
      },
      "purchase": {
        "endpoint": "POST /v1/patent-reality-check/batch/checkout",
        "requires": [
          "email",
          "patent_numbers (51-5000)",
          "confirmed_no_withdrawal"
        ]
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "hard_rule": "Never asserts Google Patents (or any third party) is 'wrong' in general, and never claims the same error rate applies to other providers - only reports the specific, dated, evidenced mismatch against the USPTO's own primary-source record for the exact patent checked."
      },
      "sla": null,
      "expected_confidence": {
        "measured_on": "n=50 random sample, seed 20260906, over the full 179,840-record corpus",
        "google_patents_error_rate": 0.28,
        "google_patents_error_rate_ci95": [
          0.175,
          0.417
        ],
        "note": "Characterized as a ~2-5 month update-lag window (all 14 mismatches were 60-144 days old; a separate n=20 sample aged 180-365 days came back 0/20 incorrect), not a persistent error. Full method: https://nkodatalabs.com/products/patent-reality-check/"
      },
      "confidence_note": "Per-result confidence is binary and source-grounded (1.0 when matched against the primary official USPTO record, null/unknown otherwise) - never a statistical estimate presented as more precise than it is.",
      "mcp_tool": {
        "available": false,
        "server": null,
        "transport": null
      },
      "planned_upgrades": [
        "Provider Disagreement Test in progress (Google Patents + PatSnap + Espacenet + Lens.org over 100 patents, 50 known-LAPSED + 50 known-ACTIVE control) - result not yet folded into this catalog entry.",
        "EPO/INPADOC coverage (non-US jurisdictions) blocked on an EPO OPS account the owner has not yet created - v1 is US-only by explicit scope decision, not a technical shortcut."
      ],
      "method_version": "nko-reality-check-001-v0.1-2026-09-06"
    },
    {
      "product_id": "vuln_severity_reality_check",
      "name": "NKO Reality Check #002 — Vulnerability severity disagreement",
      "task": "Given a real CVE ID, does every independently-published severity score (NVD, GHSA, vendor PSIRTs, CISA-ADP) agree on severity category (CRITICAL/HIGH/MEDIUM/LOW), or does it change what gets fixed first?",
      "status": "LIVE",
      "gate": "PASS_PUBLISHED",
      "input_schema": {
        "cve_id": "string, real CVE ID, e.g. 'CVE-2026-58443'"
      },
      "output_schema": {
        "cve_id": "string, normalized",
        "nvd_url": "string, NVD detail page URL",
        "nvd_published": "ISO8601, from NVD's own record",
        "nvd_vuln_status": "string, NVD's own workflow status (e.g. 'Analyzed', 'Deferred')",
        "scores": "array of {source_id, source_name, cvss_version, score, vector, severity_category, nvd_reported_severity?} - one entry per independently-published CVSS score found for this CVE, each with a real source citation",
        "n_sources": "int, count of independent CVSS scores found",
        "agreement_status": "'agree' | 'disagree' - do all sources found land in the same severity_category",
        "categories_seen": "array of distinct severity_category values across all sources",
        "category_gap": "int, 0-3 - how many severity bands separate the lowest and highest category seen (0=agree, 1=adjacent band, 2-3=full-band jumps)",
        "checked_at": "ISO8601 UTC"
      },
      "coverage": {
        "sources": [
          "NVD (nvd.nist.gov, US government, public domain, official API)",
          "GHSA (GitHub Advisory Database, public read-only API)",
          "CISA-ADP and vendor PSIRTs, when present as an independent score on the NVD record"
        ],
        "source_note": "Coverage is bounded by whichever independent CVSS scores are already present on the CVE's own NVD record - this product does not scrape or independently score anything itself, it aggregates and compares what official sources have already published."
      },
      "pricing": {
        "free_tier": {
          "single_check": "unlimited, no account",
          "batch": "up to 50 CVEs per request, no account, processed asynchronously"
        },
        "paid": {
          "unit": "batch",
          "max_cves_per_batch": 10000,
          "price": 2500.0,
          "currency": "EUR",
          "recurring": false,
          "delivery": "within 24-48h, bound by NVD's own public rate limit"
        }
      },
      "purchase": {
        "endpoint": "POST /v1/vuln-severity-check/batch/checkout",
        "requires": [
          "email",
          "cve_ids (51-10000)",
          "confirmed_no_withdrawal"
        ]
      },
      "rights": {
        "return_policy": "MerchantReturnNotPermitted",
        "hard_rule": "Never asserts that NVD, GHSA, a vendor PSIRT, or CISA-ADP 'is wrong' or 'is worse' than another - severity disagreement between independently reasonable evaluations is the finding itself, not an accusation against any one organization."
      },
      "sla": null,
      "expected_confidence": {
        "measured_on": "n=188 CVEs with 2+ independent CVSS sources, drawn from a real NVD window of 2,000 CVEs published 2026-07-15/2026-08-30",
        "category_disagreement_rate": 0.532,
        "two_band_jump_count": 16,
        "note": "100/188 (53.2%) of CVEs with more than one independent CVSS score disagree on severity CATEGORY, not just the numeric score; 16 of those jump two full categories (e.g. Medium to Critical). Full method: https://nkodatalabs.com/products/vuln-severity-reality-check/"
      },
      "confidence_note": "Per-result output is a direct citation of what each source already publishes (never a re-scored or inferred severity) - the only derived field is category_gap, a deterministic count of bands between the lowest and highest severity_category already reported.",
      "mcp_tool": {
        "available": false,
        "server": null,
        "transport": null
      },
      "planned_upgrades": [
        "Practical-impact check on the separate, narrower 'GHSA nvd_published_at empty' finding completed 2026-09-07: low practical impact in an 8-case field-by-field comparison (GHSA already had full CVSS+CWE+scope in 7/8 cases) - not folded into this product, kept as a documented non-finding."
      ],
      "method_version": "nko-reality-check-002-v0.1-2026-09-07"
    }
  ],
  "in_development": [
    {
      "product_id": "operating_verdicts",
      "task": "Is that factory actually operating? Night-lights and thermal signatures.",
      "status": "IN_DEVELOPMENT",
      "url": "https://nkodatalabs.com/pipeline/operating-verdicts/",
      "note": "Genuinely partial: optical/SAR channel validated (real signal at a confirmed-operating site, clean negative control), thermal channel tested and honestly FAILED its own pre-registered threshold - not withheld, still actively worked."
    },
    {
      "product_id": "trade_flows",
      "task": "Equipment moved before the factory opened - customs flows as a leading indicator.",
      "status": "IN_DEVELOPMENT",
      "url": "https://nkodatalabs.com/pipeline/trade-flows/",
      "note": "Genuinely partial: confirmatory (component-dependency) signal validated with a real rising series, but the precursor (equipment) signal did not validate - reported as NO_CLEAN_PROXY_AVAILABLE, not forced positive."
    },
    {
      "product_id": "energy_pressure_baleares",
      "task": "Real electrical demand per person actually present (not per registered resident), by Balearic island.",
      "status": "IN_DEVELOPMENT",
      "url": "https://nkodatalabs.com/pipeline/energy-pressure-baleares/",
      "note": "Genuinely partial: single base-year (2023) sample only, real finding (Eivissa highest per-capita demand) not yet explained/decomposed."
    }
  ],
  "published_findings": [
    {
      "product_id": "landfill_reality_delta",
      "task": "Cross what EPA LMOP declares as a landfill's fill rate against what NKO independently measures via LiDAR, including the sensor's own blind spot.",
      "status": "LIVE",
      "url": "https://nkodatalabs.com/pipeline/landfill-reality-delta/",
      "note": "See products[] above for the full entry (distribution, method, coverage) - this line exists only so this array lists every finished, linked, free finding in one place."
    },
    {
      "product_id": "waste_pressure_palma",
      "task": "Real monthly waste tonnage Palma generates per person actually present in Mallorca (not per registered resident).",
      "status": "LIVE",
      "url": "https://nkodatalabs.com/pipeline/waste-pressure-palma/",
      "note": "Complete real 12-month table (2025), now linked from /products/ (2026-09-04). Licensing note: EMAYA reuse right accepted as a documented residual risk, see page."
    },
    {
      "product_id": "china_tourism_reality",
      "task": "Chinese tourist arrivals to the EU: China's own outbound reporting vs. real per-country Eurostat arrival statistics.",
      "status": "LIVE",
      "url": "https://nkodatalabs.com/pipeline/china-tourism-reality/",
      "note": "Real EU27 2024 aggregate (7,280,745 arrivals) verified; per-country breakdown shows only the 8 largest destinations, not the full EU27 - real remaining gap, disclosed on the page. Expansion blocked 2026-09-05: Eurostat's dissemination API is erroring on every dataset tested, not just this one."
    },
    {
      "product_id": "china_students_reality",
      "task": "Chinese citizens enrolled in EU tertiary education, real per-country counts.",
      "status": "LIVE",
      "url": "https://nkodatalabs.com/pipeline/china-students-reality/",
      "note": "Real EU27 2022 aggregate (90,319) verified; per-country breakdown shows only the 7 largest host countries, not the full EU27 - real remaining gap, disclosed on the page. Same Eurostat API blocker as china_tourism_reality."
    }
  ],
  "known_gaps_this_catalog_does_not_paper_over": [
    "The verdict/evidence response block (verdict/confidence/declared_state/observed_state/delta/sensor_agreement/evidence/recommended_next_action) is implemented for find_missing (full verdict_block, see output_schema above) and physical_change (verdict_envelope, sites_carry_verdict_block=true). license_drift has its own structured severity/diff output (severity/changes/machine_action) that serves the same evidentiary purpose but is not wrapped in the same named verdict_block shape - a real, specific gap, not a blanket 'no product has this'. china_industrial_reality has no output_schema at all (gate BLOCK, not for sale). verified_negatives and landfill_reality_delta are static datasets, not live per-call verdicts - not applicable.",
    "No product publishes a single aggregate accuracy/confidence number today - every expected_confidence field above is null, honestly, rather than a guessed value."
  ]
}
