Influencer Hub event bridge

The inf-minimalist to i3 event stream · payloads, idempotency keys, replay and the blocked queue · a suppressed event is a success, a blocked one is not, and both are counted

The Influencer Hub emits nothing. All 4 topics are exists_in_hub = FALSE. app/api/webhooks.py registers 7 routes, every one of them inbound to the Hub. There is no outbound emitter. Master plan section 4 and INV2 PRD 6.6 both list these topics as an existing contract; they are not. Blocked on PR inf-minimalist#outbound.
The Hub cannot sign. Its webhook auth is a shared bearer in X-Webhook-Secret compared with compare_digest, not an HMAC over the raw body. Events arriving that way land as signature_state = bearer_only: accepted, flagged, and never trusted for a write-off. The emitter PR must add the signer.

Topic registry

A topic cannot be enabled while the sibling cannot emit it · ck_iet_exists makes readiness unclaimable on someone else's behalf

4 never seen1 internal path live
deal/anchored
Pre-registers a deal and its Shopify order before the order webhook lands. The topic that prevents the double deduct.
never seennot in hub
gift/dispatched
Claims leg allocate. Suppressed when the Shopify order line already claimed it.
never seennot in hub
gift/returned
Claims leg return_in. Good goes to STOCK, damaged goes to QUARANTINE, never straight to STOCK.
never seennot in hub
gift/finalized
Raises a write-off proposal. Posts nothing. The ledger row waits for a finance approver.
never seennot in hub
shopify anchored order
The path that actually works today. Module 14 classifies an anchored line as an allocation, before straight_sale.
2m ago · 148 / 24hlive
hub mirror pull
Nightly read of influencers and deals into custodians. Read only; i3 never writes back.
04:10 · 10h agolive
anchor back-fill
Catches orders that arrived before their anchor. 4,381 historical deals processed, 4 still open.
02:00 · 12h agolive
custody.blocked (out)
i3 to Hub. Tells the Hub to stop creating deals for a frozen custodian. Queued in the outbox.
2 queuedno consumer

Events per hour · last 24h

Processed, suppressed and blocked stacked · a suppression spike means the Hub started double-claiming, which is exactly what you want to see caught

133 processed11 suppressed4 blocked
15:00 · 3 processed 16:00 · 4 processed 17:00 · 5 processed 17:00 · 1 suppressed 18:00 · 3 processed 19:00 · 2 processed 20:00 · 1 processed 21:00 · 1 processed 22:00 · 0 23:00 · 0 00:00 · 0 02:00 · 1 processed · mirror pull 04:00 · 9 processed · nightly back-fill 04:00 · 3 suppressed 04:00 · 2 blocked · unknown anchor 06:00 · 4 processed 08:00 · 8 processed 08:00 · 2 suppressed 09:00 · 13 processed · peak 09:00 · 2 suppressed 10:00 · 11 processed 10:00 · 1 blocked · closed holding 11:00 · 10 processed 12:00 · 9 processed 12:00 · 2 suppressed 13:00 · 7 processed 14:00 · 10 processed 14:00 · 1 blocked · unknown SKU 15:00 · 6 processed 16:00 · 5 processed 16:00 · 1 suppressed 17:00 · 4 processed (partial hour) 18:00 · not yet
15:0018:0021:0000:0004:00 back-fill09:00 peak13:0017:00 now
Processed 133Suppressed 11 (working as designed)Blocked 4 (needs a human)

Event stream

16 of 148 · click a row for the raw payload, its digest and the claim it produced or the reason it produced none

page 1 / 10
ReceivedTopicAnchor keyIdempotency keySig QtyOutcomeReasonmsClaim
17:12:04.221shopify.anchoredinf:D-88914:0shopify:Order/61402:L1 HMAC2processed-204PCC-31882
16:58:41.007shopify.anchoredinf:D-88911:0shopify:Order/61398:L1 HMAC1processed-186PCC-31881
16:44:12.940shopify.anchoredinf:D-88911:0shopify:Order/61398:L1 HMAC1suppressedduplicate delivery91PCC-31881
16:20:33.512mirror.pull-mirror:2026-07-29 SSO-processed5,231 custodians2,140-
14:06:18.774shopify.anchoredinf:D-88902:1shopify:Order/61371:L2 HMAC1blockedunknown_sku CUSTOM-ENGRAVE412-
13:41:52.108shopify.anchoredinf:D-88898:0shopify:Order/61364:L1 HMAC3processed-231PCC-31874
12:18:07.443shopify.anchoredinf:D-88891:0shopify:Order/61352:L1 HMAC1suppressedduplicate delivery88PCC-31869
12:04:29.661shopify.anchoredinf:D-88891:0shopify:Order/61352:L1 HMAC1processed-196PCC-31869
10:52:14.208i3.returninf:D-88214:0inf:return:D-88214:0:1 internal1blockedclosed_holding already returned104-
09:31:44.902shopify.anchoredinf:D-88874:0shopify:Order/61329:L1 HMAC2processed-252PCC-31861
09:14:02.330shopify.anchoredinf:D-88871:0shopify:Order/61322:L1 HMAC1suppressedduplicate delivery79PCC-31858
04:02:11.008anchor.backfillinf:D-71204:0backfill:D-71204:0 internal1blockedunknown_anchor deal has no line index338-
04:02:10.117anchor.backfillinf:D-71198:0backfill:D-71198:0 internal1blockedunknown_anchor order gid not found301-
04:01:58.442anchor.backfillinf:D-71186:0backfill:D-71186:0 internal1processedanchored retroactively288PCC-31802
04:01:44.019anchor.backfillinf:D-71180:0backfill:D-71180:0 internal2suppressedalready anchored 24-0772PCC-30918
02:00:03.771mirror.pull-mirror:2026-07-28 SSO-replayedadmin replay · a.yousuf2,088-
Suppression is counted, not hidden. 11 suppressed events in 24 hours means the unique index on (anchor_key, leg) is doing work. A dedup rate of exactly zero would be indistinguishable from a claim mechanism nobody wired up, which is the failure module 08 named on the reverse side.

Payload · event 20837

Blocked · unknown_sku · nothing was posted

blocked
{ "source": "shopify", "order_gid": "gid://shopify/Order/61371", "order_name": "#MIN10482", "line_gid": "gid://shopify/LineItem/L2", "anchor": { "key": "inf:D-88902:1", "evidence": "hub_preregistration", "confidence": 1.000 }, "custodian_ref": "CUST-INF-00871", "campaign_ref": "CMP-SS26-014", "sku": "CUSTOM-ENGRAVE", "qty": 1, "unit_price_aed": 0.00, "origin_location": "HQ_319", "return_policy": "keep" }
sha256 digest
a91f4c…7d02
Computed idem key
shopify:Order/61371:L2
Signature state
verified (HMAC)
Claim produced
none
Block reason
unknown_sku
Detail
CUSTOM-ENGRAVE resolves to no row in skus and no alias. A personalisation service line, not a physical unit.
Ledger effect
none, by design
Propose a rule ↗

Why this page exists

An influencer gift already travels as a Shopify order. 4,381 of 6,608 Hub deals carry a shopify_order_id; only 2 use a draft order. So the moment Shopify ingest went live, every gift already posted a ledger row as an ordinary sale.

If i3 also subscribed to gift/dispatched and posted its own deduction, every gift would deduct twice. That is defect D14 and D16 arriving in a third place.

The fix is the same shape module 08 used on the reverse side: one anchor, one leg, one claim, enforced by UNIQUE (anchor_key, leg) WHERE superseded_by IS NULL. Whichever system claims first wins; the second is suppressed and recorded.

Blocked is not suppressed

Suppressed means a second system tried to claim a leg that was already claimed. Correct behaviour, nothing to do, count it so we can prove the mechanism fires.

Blocked means i3 could not act: an anchor it does not recognise, a SKU that resolves to nothing, a holding already closed, a frozen custodian. Every one needs a human, and none of them silently posts a guess.

v2 had a single unmatched bucket and a "drift_audit" status covering both. Merging them makes a healthy dedup rate look like a broken bridge.

Replay

Replay re-runs the classifier with the current ruleset · ledger writes are idempotent on (source_system, idempotency_key), so a replay of a processed event posts nothing new

above 10 events needs feature programs_replay_bulk
ReplayRequestedByEventsScopePostedSuppressedStill blockedState
RPL-004429-07 02:00a.yousuf1mirror.pull 28-07010complete
RPL-004327-07 11:40a.yousuf6blocked · unknown_anchor411complete
RPL-004224-07 09:12a.yousuf318historical anchor back-fill302124complete
RPL-004122-07 16:05f.marketing12blocked · unknown_sku0012no rule change
RPL-004020-07 08:30a.yousuf4,063full historical deal set4,07928814complete
RPL-003918-07 14:22f.marketing28suppressed · re-check0280complete
RPL-003816-07 10:08a.yousuf1single event 19204100complete
RPL-003715-07 17:44r.kumar14blocked · closed_holding0014correctly refused
RPL-003612-07 09:00a.yousuf9bearer_only re-verify090complete
RPL-003509-07 13:15a.yousuf2single events200complete
RPL-003405-07 11:02f.marketing41campaign SS26 re-anchor3830complete
RPL-003302-07 15:50a.yousuf7blocked · unknown_anchor520complete
RPL-0040 replayed 4,063 events and posted 4,079 rows because 16 deals carried two line items each. It also suppressed 288, which is the number that proves the replay did not double-post the ones already anchored.
Connected to Influencer programme Influencer detail Sibling events Shopify events CSD events ops2 events Classifier Rules Drift Audit log Settings Ops health