{
  "schema_version": "1.3.0",
  "slug": "when-does-an-event-at-the-batch-stream-seam-get-counted-twice-or-dropped",
  "title": "When does an event at the batch-stream seam get counted twice or dropped?",
  "date_of_record": "2026 November 1",
  "scope": "Applies to architectures that process the same data through a batch path and a streaming path and then combine the results, where each path decides boundary membership independently. Excludes lambda architectures that reconcile to a single source of truth.",
  "projections": {
    "unified_markdown_uri": "https://corpusfetch.com/c/when-does-an-event-at-the-batch-stream-seam-get-counted-twice-or-dropped.md",
    "method_python_slice_uri": "https://corpusfetch.com/c/when-does-an-event-at-the-batch-stream-seam-get-counted-twice-or-dropped.py",
    "remnant_warrant_slice_uri": "https://corpusfetch.com/c/when-does-an-event-at-the-batch-stream-seam-get-counted-twice-or-dropped.warrant.json"
  },
  "token_profile": {
    "full_markdown_tokens": 803,
    "python_slice_tokens": 103,
    "warrant_slice_tokens": 220
  },
  "remnant_summary": {
    "core_distinction": "**Predicate.** A batch and a stream path partition the data if and only if their ranges meet at a boundary owned by exactly one side. If batch covers [t0, t1) and stream covers [t1, t2], an event at t1 is assigned once. If both are inclusive at t1, it is counted twice; if both are exclusive, it is dropped. **Failure.** Each path is correct for its own range....",
    "what_was_observed": "**Signature.** Batch-plus-stream total differing from the source total by the event count at the seam instant, on days when the seam aligns with traffic. The delta is stable across runs and reproducible for a fixed seam. **Trace.** Batch job runs for [00:00, 24:00) inclusive of both ends. Stream starts at 24:00 inclusive. The event at exactly 24:00:00.000 appears in both the day's batch and the next day's stream, and...",
    "condition_of_validity": "The combined result is exact only while at least one holds: 1. **Single seam owner.** The boundary instant is assigned to exactly one path by a shared rule, and the rule is enforced rather than assumed. 2. **Idempotent combine.** The combination deduplicates by event id, so double-counting is absorbed and gaps are the only remaining risk. 3. **Reconciliation...",
    "decision_boundary": "- Seam owned by one path, enforced: exact partition. - Both inclusive: double count at the seam. - Both exclusive: gap at the seam. - Idempotent combine: double counts removed, gaps remain. Acceptable only with a gap check.",
    "operational_effect": "The seam is a coordination point between two systems with different owners and different scheduling, so it is rarely specified and never tested. Remediation is to make the boundary rule shared and explicit. The trap is to overlap the ranges slightly to avoid gaps, which converts a clean assignment problem into a guaranteed double count over the overlap."
  },
  "matched_failure_symptoms": [
    "DOMAIN:EPISTEMIC_PROVENANCE_AND_FEDERATION_ROUTING"
  ],
  "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": "06ba9de3929c45a20b28d22a7ad20d2e335c04dc8380a40a9c069d1c9be06f7b",
    "verified_classes": [
      "SeamAssignmentError",
      "SeamGate"
    ],
    "verified_functions": [
      "dispatch_combine_mode",
      "verify"
    ],
    "verified_functions_count": 2,
    "defensive_guards_count": 2,
    "raised_exceptions": [
      "SeamAssignmentError"
    ],
    "sample_fail_closed_invariants": [
      "seam assigned to both paths: double count",
      "seam assigned to neither path: dropped events"
    ],
    "stdlib_dependencies": [
      "dataclasses"
    ],
    "observation_mode": "EMPIRICAL_BOUNDARY_CAPTURE",
    "zero_external_deps": true
  }
}
