Skip to content

Roles and stylesheet

Classes are roles. accent, ok, warn, danger, muted, the dashed cluster group and the edges failure and async take their tones from the theme; queue and senders come from the site stylesheet docs/src/styles/diagrams.css, which pages link only as compiled CSS. The inline diagram follows the theme switch in the header; the two images are standalone SVGs with the light and dark themes baked in, so they keep their colours in any host.

Source: bench/fixtures/roles/, shared with the stylesheet parity gate.

Push scheduler with roles Flowchart, left to right. 13 nodes, 15 edges. cron trigger every minute idempotent run key → lease one run per window 90 s TTL durable workflow: lease one run per window 90 s TTL → due set scan schedules next_at ≤ now durable workflow: due set scan schedules next_at ≤ now → budget 250 push slots per-tenant caps durable workflow: budget 250 push slots per-tenant caps → enqueue batches of 100 dedupe by job id durable workflow: enqueue batches of 100 dedupe by job id → wait sleep until acked or 30 s timeout; → push queue at-least-once visibility 60 s [batch] durable workflow: wait sleep until acked or 30 s timeout → finalize record outcomes advance next_at durable workflow: finalize record outcomes advance next_at → release drop the lease durable workflow: release drop the lease push queue at-least-once visibility 60 s → sender A APNs; → sender B FCM; → sender C web push; → dead letters after 5 attempts kept 14 days [max retries] consumers: sender A APNs → wait sleep until acked or 30 s timeout [ack] consumers: sender B FCM → wait sleep until acked or 30 s timeout [ack] consumers: sender C web push → wait sleep until acked or 30 s timeout [ack] durable workflow leaseone run per window90 s TTL due setscan schedulesnext_at ≤ now budget250 push slotsper-tenant caps enqueuebatches of 100dedupe by job id waitsleep until ackedor 30 s timeout finalizerecord outcomesadvance next_at releasedrop the lease consumers sender AAPNs sender BFCM sender Cweb push batch ack ack ack max retries cron triggerevery minuteidempotent run key push queueat-least-oncevisibility 60 s dead lettersafter 5 attemptskept 14 days
Push scheduler with roles
Diagram source
flowchart LR
accTitle: Push scheduler with roles
cron["**cron trigger**<br/>every minute<br/>idempotent run key"]
subgraph wf["durable workflow"]
lease["**lease**<br/>one run per window<br/>90 s TTL"]
due["**due set**<br/>scan schedules<br/>next_at ≤ now"]
budget["**budget**<br/>250 push slots<br/>per-tenant caps"]
enqueue["**enqueue**<br/>batches of 100<br/>dedupe by job id"]
wait["**wait**<br/>sleep until acked<br/>or 30 s timeout"]
finalize["**finalize**<br/>record outcomes<br/>advance next_at"]
release["**release**<br/>drop the lease"]
lease --> due --> budget --> enqueue --> wait --> finalize --> release
end
q[("**push queue**<br/>at-least-once<br/>visibility 60 s")]
subgraph consumers["consumers"]
c1["**sender A**<br/>APNs"]
c2["**sender B**<br/>FCM"]
c3["**sender C**<br/>web push"]
end
dlq[("**dead letters**<br/>after 5 attempts<br/>kept 14 days")]
cron --> lease
enqueue e1@-->|batch| q
q --> c1 & c2 & c3
c1 & c2 & c3 -.->|ack| wait
q e2@-->|max retries| dlq
class cron accent
class lease,release muted
class budget warn
class finalize ok
class dlq danger
class e1 async
class e2 failure
class wf group
class q queue
class consumers senders

Two tier roles, standalone with the light theme baked in

Two tier roles, standalone with the dark theme baked in