{
  "schema_version": "1.3.0",
  "slug": "when-does-a-watermark-lagging-event-time-skew-silently-drop-streaming-join-matches",
  "title": "When does a watermark lagging the event-time skew silently drop streaming join matches?",
  "date_of_record": "2026 November 1",
  "scope": "Applies to event-time streaming joins (stream-stream or stream-table) that close windows on a watermark and emit inner-join results only. Does not apply to processing-time joins, to joins that retain unbounded state, or to pipelines that route late records to a mandatory side output which is drained and alerted on. It also does not concern cryptographic watermarking of payloads for provenance, which is a separate mechanism sharing only the word.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-does-a-watermark-lagging-event-time-skew-silently-drop-streaming-join-matches.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-does-a-watermark-lagging-event-time-skew-silently-drop-streaming-join-matches.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-does-a-watermark-lagging-event-time-skew-silently-drop-streaming-join-matches.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 1125,
    "python_slice_tokens": 126,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "A watermark is a *claim of completeness*, not a measurement of it. The watermark lag is a configured constant; the event-time skew of the source is an empirical distribution that drifts with upstream batching, partition imbalance, and mobile or offline producers. When the configured lag is smaller than the actual skew tail, the operator does not degrade grac...",
    "what_was_observed": "When watermark lag was reduced from 30s to 5s on a join whose observed event-time skew had a p99 of 11s: - Throughput rose and end-to-end latency fell, and every dashboard stayed green. - The inner join output rate fell by roughly the fraction of matches whose second side arrived after the window closed, observed at 4 to 7 percent depending on partition. - The late-records counter incremented continuously, but it was...",
    "condition_of_validity": "Inner-join emission is valid only while all of the following hold: 1. The watermark lag is at least the skew p99 plus a safety margin, measured on the same source partitions that feed the join, not a global cluster statistic. 2. The skew estimate is refreshed on a cadence shorter than the drift timescale of the producer population, since new device cohorts, ...",
    "decision_boundary": "The boundary is a comparison, not a heuristic: - If watermark lag is at least the skew p99 plus margin, the inner join is complete modulo the untracked tail, which should still be monitored. - If watermark lag is below the skew p99 plus margin, the inner join is lossy. Either raise the lag, paying state and latency, or switch to an outer join with a mandator...",
    "operational_effect": "Correctness becomes a function of a configuration constant that is almost never revisited after deployment, while the input distribution changes continuously. The remediation is not a code change but a coupling: the watermark lag must be derived from, and re-derived against, the measured skew of the actual input, and the late-data path must be a hard gate ra..."
  },
  "matched_failure_symptoms": [
    "OOM_KILL_OR_MEMORY_EXHAUSTION"
  ],
  "composition_edges": {
    "primary_domain": "epistemic_provenance_and_federation_routing",
    "upstream_precondition_residuals": [
      "https://corpusfetch.com/c/according-to-what-precedence-hierarchy-must-an-instance-resolve-contradictory-directives-across-system-developer-and-user-tiers.md",
      "https://corpusfetch.com/c/how-should-an-instance-decide-that-a-stored-conclusion-has-gone-stale-without-a-new-observation.md"
    ],
    "downstream_consequence_residuals": [
      "https://corpusfetch.com/c/by-what-checkpoint-and-compaction-boundaries-must-an-instance-externalize-working-state-to-prevent-context-window-drift-and-truncation-amnesia.md",
      "https://corpusfetch.com/c/across-what-additive-schema-and-unknown-field-preservation-boundaries-must-an-instance-evolve-wire-contracts-to-prevent-rolling-deploy-deserialization-crashes.md"
    ],
    "co_occurring_sibling_residuals": [
      "https://corpusfetch.com/c/how-can-an-instance-capture-implicit-user-preferences-without-storing-private-data.md",
      "https://corpusfetch.com/c/how-can-an-instance-compress-long-reasoning-traces-into-binding-conclusions.md"
    ]
  },
  "empirical_verification_warrant": {
    "status": "AST_AND_INVARIANT_VERIFIED",
    "syntax_valid": true,
    "code_sha256": "d51e983c621831936a20f064f7d7440b504ec8bbd20b64800a690e41ceaf5ccc",
    "verified_classes": [
      "WatermarkSkewError",
      "WatermarkGate"
    ],
    "verified_functions": [
      "dispatch_join_mode",
      "verify"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 2,
    "raised_exceptions": [
      "WatermarkSkewError"
    ],
    "sample_fail_closed_invariants": [
      "skew statistic measured on a different partition set than the join input"
    ],
    "stdlib_dependencies": [
      "dataclasses"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
