{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://zoningsignal.com/schema/signal-model.json",
  "version": "2026-05-08",
  "models": {
    "signal_strength": {
      "range": {
        "min": 0,
        "max": 100
      },
      "interpretation": "Composite measure of civic/regulatory motion intensity for a given place, corridor, or pattern.",
      "inputs": [
        "frequency of triggering events in trailing 12 months",
        "recency-weighted decay (more recent events dominate)",
        "cross-jurisdiction recurrence (same pattern detecting across multiple places)",
        "source confidence (multi-source corroboration)",
        "structural materiality (board fracture > procedural delay)"
      ]
    },
    "direction": {
      "values": [
        "rising",
        "stable",
        "cooling"
      ],
      "definitions": {
        "rising": "Signal score has increased ≥5 points in the trailing 90 days OR new exhibits surfaced in the last 30 days.",
        "stable": "Signal score change within ±5 points across trailing 90 days.",
        "cooling": "Signal score has decreased ≥5 points OR no new exhibits in trailing 90 days."
      }
    },
    "confidence": {
      "values": [
        "low",
        "medium",
        "high",
        "very-high"
      ],
      "definitions": {
        "low": "Single source; speculative; opportunity for misread.",
        "medium": "Two corroborating sources; pattern recognized but not crystallized.",
        "high": "Three+ corroborating sources; pattern named and exhibited; reasonable forecasting confidence.",
        "very-high": "Statutory or formal-record-grade evidence; deterministic from the corpus."
      }
    },
    "confidence_pips": {
      "range": {
        "min": 0,
        "max": 5
      },
      "interpretation": "Visual rendering of confidence as 0-5 filled dots. Maps roughly: pips ≤1 → low; pips 2 → medium; pips 3-4 → high; pips 5 → very-high."
    }
  },
  "lifecycles": {
    "watch": {
      "values": [
        "pending",
        "resolved",
        "obsolete",
        "archived"
      ],
      "transitions": {
        "pending → resolved": "When the watched event occurs and the operator authors the resolution cluster",
        "pending → obsolete": "When the predicted event is preempted, cancelled, or made moot before its trigger",
        "resolved → archived": "Operator housekeeping — never automatic"
      }
    },
    "pattern": {
      "values": [
        "candidate",
        "confirmed",
        "revised",
        "retired"
      ],
      "promotion_criteria": {
        "candidate": "Newly named; <3 exhibits OR <60% directional accuracy on related watches",
        "confirmed": "≥3 exhibits AND ≥60% directional accuracy on related watches",
        "revised": "Calibration data has driven a revision; pattern signal_status reflects the revision",
        "retired": "Field dynamics have shifted; pattern no longer detects"
      }
    }
  },
  "prediction_assessment": {
    "directional": {
      "values": [
        "aligned",
        "mixed",
        "misread",
        "unforeseen"
      ],
      "rating_scale": {
        "aligned": 4,
        "mixed": 3,
        "misread": 2,
        "unforeseen": 1
      }
    },
    "horizon": {
      "values": [
        "within",
        "early",
        "late"
      ]
    },
    "significance": {
      "values": [
        "confirmed",
        "overstated",
        "understated"
      ]
    }
  },
  "track_record_calibration": {
    "directional_accuracy_pct": "(aligned + 0.5 × mixed) / total_resolved × 100",
    "horizon_accuracy_pct": "within / total_resolved × 100",
    "significance_accuracy_pct": "confirmed / total_resolved × 100"
  }
}