{
  "version": "0.1",
  "description": "Station X Trust Score methodology v0.1. Scores a host 0-100 from externally observed, point-in-time TLS behaviour. Three of five dimensions (PQC Deployment, TLS Configuration, Certificate Lifecycle) are DIRECT measurements of the handshake and certificate. Two dimensions (Crypto-Agility, Dependency Risk) are DECLARED PROXIES: at v0.1 they infer posture from transport-layer signals and their stated limits are published below, not hidden. Any score is reproducible bit-for-bit from its stored observation row. Real-organisation scores are external observations of public endpoints (TLS handshakes only), presented as point-in-time facts, not opinions.",
  "bands": {
    "ultra_min": 75,
    "hybrid_min": 50
  },
  "dimensions": [
    {
      "key": "pqc_deployment",
      "label": "PQC Deployment",
      "weight": 35,
      "measurement": "direct",
      "description": "Does the endpoint actually perform a hybrid post-quantum key exchange? Measured directly by offering the X25519MLKEM768 hybrid group (FIPS 203 ML-KEM + X25519) in a real handshake and reading the negotiated group. This is the flagship signal: it is the only dimension that speaks to harvest-now-decrypt-later resistance, which is why it carries the most weight.",
      "signals": [
        {
          "key": "pqc_hybrid_kex_negotiated",
          "label": "Hybrid PQC key exchange negotiated",
          "max": 85,
          "description": "Full points when the server negotiates X25519MLKEM768 when offered a hybrid ClientHello. Zero otherwise. Directly observed from the negotiated group (crypto/tls ConnectionState.CurveID)."
        },
        {
          "key": "pqc_only_capable",
          "label": "PQC-only handshake accepted",
          "max": 15,
          "description": "Full points when a handshake offering ONLY the hybrid PQC group succeeds — evidence PQC is genuinely deployed rather than merely tolerated alongside a classical fallback."
        }
      ]
    },
    {
      "key": "tls_configuration",
      "label": "TLS Configuration",
      "weight": 20,
      "measurement": "direct",
      "description": "Baseline transport hygiene, measured directly: modern protocol floor and ceiling, and authenticated-encryption cipher selection.",
      "signals": [
        {
          "key": "tls13_supported",
          "label": "TLS 1.3 supported",
          "max": 45,
          "description": "Full points when TLS 1.3 is negotiated. TLS 1.3 is also the floor required for the hybrid PQC group."
        },
        {
          "key": "no_legacy_protocols",
          "label": "No legacy TLS (1.0/1.1)",
          "max": 35,
          "description": "Full points when handshakes offering a TLS 1.0 or 1.1 ceiling are refused (protocol floor is \u003e= TLS 1.2)."
        },
        {
          "key": "aead_cipher",
          "label": "AEAD cipher negotiated",
          "max": 20,
          "description": "Full points when the negotiated cipher is AEAD (AES-GCM or ChaCha20-Poly1305); non-AEAD (CBC) scores zero."
        }
      ]
    },
    {
      "key": "crypto_agility",
      "label": "Crypto-Agility",
      "weight": 15,
      "measurement": "declared_proxy",
      "description": "DECLARED PROXY (v0.1). We do not have inside visibility into an organisation's ability to rotate cryptographic primitives, so v0.1 infers it from two external transport signals: certificate rotation cadence and protocol currency. LIMITS, stated plainly: certificate lifetime is an imperfect proxy for automation — a long-lived certificate does not prove an inability to rotate, and a short one does not prove broad agility beyond TLS. Protocol currency (running TLS 1.3) indicates willingness to adopt new transport crypto but says nothing about application-layer or key-management agility. These signals correlate with, but do not measure, true crypto-agility. A future version intends to incorporate signed rotation attestations.",
      "signals": [
        {
          "key": "rotation_cadence_proxy",
          "label": "Certificate rotation cadence (proxy)",
          "max": 55,
          "params": {
            "full_days": 100,
            "partial_days": 398,
            "partial_fraction": 0.5
          },
          "description": "Full points for a certificate lifetime \u003c= 100 days (consistent with automated ACME issuance/rotation); half for \u003c= 398 days; zero for longer (manual rotation likely). Proxy signal — see dimension limits."
        },
        {
          "key": "protocol_currency_proxy",
          "label": "Protocol currency (proxy)",
          "max": 45,
          "params": {
            "tls12_fraction": 0.4
          },
          "description": "Full points for TLS 1.3; 40% for TLS 1.2 top; zero otherwise. Proxy for willingness to adopt current transport cryptography."
        }
      ]
    },
    {
      "key": "certificate_lifecycle",
      "label": "Certificate Lifecycle",
      "weight": 15,
      "measurement": "direct",
      "description": "Directly measured certificate health: is the presented chain trusted and unexpired, is it comfortably within its renewal window, and is its lifetime within modern compliance limits?",
      "signals": [
        {
          "key": "valid_not_expired",
          "label": "Trusted, unexpired chain",
          "max": 40,
          "description": "Full points when the leaf chain verifies against the system trust store and is not expired at observation time."
        },
        {
          "key": "renewal_health",
          "label": "Healthy renewal window",
          "max": 35,
          "params": {
            "healthy_days": 21,
            "warning_days": 7,
            "warning_fraction": 0.5
          },
          "description": "Full points with \u003e= 21 days remaining; half with \u003e= 7; zero when expiring within a week or already expired. Days-remaining is resolved at observation time and stored, so scoring stays reproducible."
        },
        {
          "key": "lifetime_compliance",
          "label": "Lifetime within limits",
          "max": 25,
          "params": {
            "max_days": 398
          },
          "description": "Full points for a certificate lifetime \u003c= 398 days (the current CA/Browser Forum maximum)."
        }
      ]
    },
    {
      "key": "dependency_risk",
      "label": "Dependency Risk",
      "weight": 15,
      "measurement": "declared_proxy",
      "description": "DECLARED PROXY (v0.1). True dependency/supply-chain risk (JavaScript subresources, third-party origins, DNS/CDN provider concentration) is NOT inspected at v0.1 — we perform TLS handshakes only. v0.1 approximates operational maturity from two transport-layer signals: HSTS posture and certificate-authority reputation. LIMITS, stated plainly: a reputable CA and an HSTS header indicate a maintained deployment but say nothing about the breadth of an org's software supply chain or its provider concentration. Treat this dimension as a coarse maturity proxy, not a supply-chain audit. A future version intends to add subresource and DNS/provider analysis.",
      "signals": [
        {
          "key": "hsts_posture",
          "label": "HSTS posture (proxy)",
          "max": 50,
          "params": {
            "strong_max_age": 15552000,
            "weak_fraction": 0.5
          },
          "description": "Full points for HSTS with max-age \u003e= 180 days; half for a present-but-short HSTS; zero when absent. Proxy for downgrade-resistance discipline."
        },
        {
          "key": "ca_reputation",
          "label": "CA reputation (proxy)",
          "max": 50,
          "params": {
            "reputable_orgs": [
              "Let's Encrypt",
              "DigiCert",
              "Sectigo",
              "GlobalSign",
              "Google Trust Services",
              "Amazon",
              "Entrust",
              "Microsoft",
              "GoDaddy",
              "IdenTrust",
              "Cloudflare",
              "SSL.com",
              "Actalis",
              "Buypass",
              "ZeroSSL"
            ],
            "unknown_fraction": 0.5
          },
          "description": "Full points when the issuing CA organisation is in the published reputable set; half for any other publicly-trusted issuer; zero when untrusted. Proxy for issuance-chain risk."
        }
      ]
    }
  ]
}
