Wrap your window strategy with .triggering(...) to specify when panes should fire: e.g., AfterWatermark.pastEndOfWindow() combined with AfterProcessingTime or AfterPane early firings.
Chain .withAllowedLateness(Duration) on the window to keep state open for late data after the watermark passes.
Set accumulation mode: .accumulatingFiredPanes() re-emits all data seen so far in each pane; .discardingFiredPanes() emits only new data since the last firing.
Downstream consumers must handle multiple panes per window key when triggers fire early; use pane info (isFirst, isLast, timing) to filter or deduplicate.
Test trigger behaviour with DirectRunner by advancing the watermark manually or using TestStream.
Known gotchas
Accumulating mode grows state indefinitely until the window closes; use it only when downstream sinks can handle retractions or idempotent upserts.
Combining triggers with OrFinallyTrigger or AfterEach can produce complex firing schedules that are hard to reason about; prefer simple composite triggers.
AllowedLateness interacts with trigger mode: once the final pane fires, late data is dropped unless lateness is explicitly allowed.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp