1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
[]
= "backbone-mailing"
= "0.6.0"
= "2021"
= "Email marketing — mass-mail engine: audiences, subscriptions, hand-set mailing lifecycle, seeded A/B testing, per-recipient traces, cycle-44 bridge targets (Odoo mass_mailing port)"
= "MIT OR Apache-2.0"
= "https://github.com/faridlab/backbone-mailing"
= [".claude/", ".github/", "graphify-out/"]
[]
= "src/lib.rs"
[]
# -----------------------------------------------------------------------------
# Backbone Framework crates
#
# Pulled directly from the public framework repository so this skeleton works
# anywhere on disk without path fix-up. For reproducible builds, pin to a
# specific tag or commit by replacing `branch = "main"` with `tag = "vX.Y.Z"`
# or `rev = "<commit-sha>"`. Cargo dedupes the git fetch — the repo is only
# cloned once even though four crates reference it.
# -----------------------------------------------------------------------------
= { = "3.0.0", = ["postgres"] }
= { = "3.0.0" }
= { = "3.0.0" }
= { = "3.0.0" }
# The public trace-route family (pixel + click) is throttled at middleware
# (ADR-0019 action_link-class routes).
= { = "3.0.0" }
# Sibling modules consumed through their public service surfaces: mail owns
# the outgoing queue the send engine enqueues into (plus the email blacklist
# and the sms gateway the sms channel rides). Pinned to the public tag so a
# host consuming THIS module as a git dependency resolves ONE copy of mail
# (tag-equal with the app pin — the composition rule mailing>=v0.2.0 needs
# mail>=v0.2.5; this equals the host's current mail pin). Campaign/utm
# masters and the short-link click seam stay in backbone-engagement and are
# reached through one-way logical uuid refs — no code dep and no DB FK
# crosses a schema boundary.
= { = "0.3.0" }
# Core async runtime and serialization
= { = "1.0", = ["full"] }
= "0.1"
= { = "1.0", = ["derive"] }
= "1.0"
= { = "1.0", = ["v4", "serde"] }
= { = "0.4", = ["serde"] }
# Money/quantities — near-universal in domain modules. Generated code for any `decimal`
# field imports rust_decimal, so ship it (and the matching sqlx feature) by default.
= { = "1.36", = ["serde"] }
# Database (PostgreSQL primary)
= { = "0.8", = ["runtime-tokio-rustls", "postgres", "uuid", "chrono", "json", "migrate", "rust_decimal"] }
# HTTP framework (Axum)
= { = "0.7", = ["macros"] }
= "0.4"
= { = "0.5", = ["cors", "trace"] }
# Logging
= "0.1"
= { = "0.3", = ["env-filter"] }
# Validation
= { = "0.16", = ["derive"] }
# Deterministic A/B fragment membership (HMAC-SHA256 over the persisted
# sampling seed) and seed minting — the engine's only crypto surface.
= "0.12"
= "0.10"
= "0.8"
# Error handling
= "1.0"
= "1.0"
# Configuration
= "0.14"
= "0.9"
# Protocol Buffers (Generated from Schema-First YAML)
= "0.12"
= "0.13"
= "0.13"
# OpenAPI schema derive. The generator emits `use utoipa::ToSchema;` in every
# entity and DTO behind the `openapi` feature, so the crate only builds with that
# feature on when the derive's crate is present: a feature that cannot compile is
# not a feature.
= { = "5", = ["chrono", "uuid"] }
[]
= []
= []
= []
= []
= []
= []
[]
= "0.12"
[]
= "3.0"
= "0.4"
= "0.12"
= "1.0"
# Integration testing framework — the generated tests/integration_tests.rs hits a live server
# via reqwest; guarded-route probes hit the router in-process via tower's ServiceExt::oneshot.
= { = "0.12", = ["json", "rustls-tls"] }
= "9.3"
# Test-only: the send engine enqueues through backbone-mail's public services,
# which stage outbox bus events into messaging.outbox_events — a table the
# outbox crate owns and migrates itself (the test harness runs that migration).
= { = "3.0.0" }