Dock Blocks, lifecycle
1 October 2026
What a person looks at to run lifecycle, and what sits behind it. Every row below is real: the journeys are catalogue rows, the audience is win-back's actual pilot, the blocks are the eight that exist. Nothing here is a invented screenshot.
Part 1
LimeJourney runs Kafka, ClickHouse, Redis, Postgres and Temporal to do this. We do it with a nightly warehouse, files in git, and one durable engine. The difference is not sophistication, it is volume: their diagram is built for event streams we do not have.
State at send time. The warehouse computes identity, consent and stage every night and our reporting already reads it, but no journey consults it at the moment of sending. That is the same sentence as the shared gate having no production caller, and it is the whole prototype.
Part 2
What exists, who is running, who is stopped, and what a launch would refuse right now. Control is three verbs: pause, resume, drain.
| Journey | State | Audience | In flight | Last send | Next due | Gate |
|---|---|---|---|---|---|---|
| Dormant win-back | paused | gate1_pilot (150) | 0 | never sent | on green light | blocked: domain |
| Reconversion | live | returning leads | unknown | 2026-09-30 | on trigger | ok |
| Product nurture | live | 22 Brevo lists | unknown | 2026-09-29 | on trigger | ok |
| Welcome SMS | live | new leads, list 68 | unknown | 2026-10-01 | on create | ok |
| Shipped notice | live | orders marked shipped | n/a | 2026-10-01 | on event | transactional |
| Distributor receipt | built | distributor uploads | 0 | never | on upload | ok |
| SMS drip 2 to 4 | built | non-converters | 0 | never sent | held | held |
| Trade show re-engage | draft | C13, not defined | 0 | never | not scheduled | no audience |
Why no add-a-path button. Authoring stays a file and a review. A page that lets somebody add a branch by clicking is a page where nobody can answer what changed last Tuesday, and this estate already has four documents nobody can date.
| Check, re-run on refresh | Now | What it read |
|---|---|---|
| Audience resolves and is pinned | pass | 150 rows, gate1_pilot.csv |
| Suppression read fresh | pass | 18,390 addresses, read at check time |
| Consent is opt-in, not not-opted-out | pass | checked per person |
| Per-person frequency | pass | promo 30d, editorial 7d, SMS 14d, 3 in 30 ceiling |
| Sending domain authenticated | FAIL | m.dock-blocks.com has no SPF and no DKIM |
| Domain warm | FAIL | no sending history on this identity |
| Preflight receipt under 24h | pass | re-run on every refresh, not remembered |
| Version-mismatch sensor | MISSING | not built, so stranded people are invisible |
Every line is evaluated when the page loads, never remembered. Two fail today and one check does not exist, which is the honest reason win-back has not sent.
| Audience | Size | Computed | Used by | Note |
|---|---|---|---|---|
| gate1_pilot | 150 | pinned 2026-10-01 | Dormant win-back | stratified, five owners |
| gate1_rest | 1,648 | pinned 2026-10-01 | Dormant win-back wave 2 | not yet released |
| gate2 | not exported | never | nothing | no SQL exists in export_audience.py |
| returning leads | live query | on trigger | Reconversion | one send per 90 days |
| 22 nurture lists | 7 to 38 each | unknown | Product nurture | one template, varied |
Part 3
What is being built, what each message needs, and what happens when the data is not there. The variants column is the one nobody has today.
| Message | Stage | Blocks | Attributes | If absent | Variants |
|---|---|---|---|---|---|
| winback touch-1 | approved | plain text, no blocks | recipient_name, owner_name | abort | 1 |
| winback touch-2a | approved | plain text, no blocks | recipient_name | abort | 1 |
| abandoned cart | draft | masthead, greeting, body, item_row, cta, signoff, footer | first_name, items[], cta_url | omit on items | up to 6 |
| ambassador invite | draft | masthead, greeting, body, cta, signoff, footer | first_name, referral_url | refuse | 2 |
| seasonal roundup | not started | list shape | first_name, items[] | omit | unknown |
Variants is the column that earns this page. An attribute-driven message produces a different body per person, so the defect that ships is in the variant nobody rendered. On the Labor Day send six defects passed every automated check and were caught by eye. This column says how many distinct bodies exist, so review is finite and countable rather than a sample.
Win-back shows "no blocks" because it is deliberately plain, reading as a personal note from the CEO. A page that renders that as missing would push somebody to fix it.
Part 4
Copied from the outbound console, which earned trust by saying this out loud. A dashboard without this section is asking to be believed about everything on it.