Daniel Roth
31fc7ee115
use unsuccesseful outcoems constant directly in hubspot deal differ 🟪
2026-07-08 14:37:15 +00:00
Daniel Roth
4ac4dd8683
Collapse cancelled/no show to HubSpot's single 'Cancelled / No Show' value
...
'Cancelled' and 'no show' were separate strings in the outcome vocabulary,
but HubSpot only ever emits the one dropdown value 'Cancelled / No Show' -
so neither phantom string could ever match. Replace both with the real
value (mapped to NOACCESS, best-guess pending client), which also fixes the
long-standing differ mismatch: the abandonment trigger now actually fires on
Cancelled / No Show. Drops the now-unused REQT enum member.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 14:33:59 +00:00
Daniel Roth
13e3e78749
Share the unsuccessful-outcome vocabulary between differ and abandonment
...
Extract the abandonment outcome strings to a single UnsuccessfulOutcome
Literal + UNSUCCESSFUL_OUTCOMES tuple in domain.abri.models, alongside
SlotCode. The differ's NEGATIVE_OUTCOMES now references the tuple and the
reason-code mapping is keyed on the Literal, so the two can no longer
drift and a mistyped outcome fails type-checking.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 14:23:33 +00:00
Daniel Roth
002f782905
Fire Abri flows on a test project code via an override env var 🟩
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 10:25:45 +00:00
Daniel Roth
3ff99619ac
Fire Abri flows on a test project code via an override env var 🟥
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 10:24:54 +00:00
Daniel Roth
84d0e1e0d5
Date an abandonment to the deal's own dates, not now() 🟩
...
date_abandoned now resolves to the third failed attempt's confirmed
survey date, falling back to its last submission date, rather than the
processing date. This dates the OpenHousing cancellation to when the
job actually lapsed even if the trigger message lags or redelivers.
- domain: abandonment_date() encodes the confirmed-survey -> last-
submission fallback
- DealAbandonment carries both dates; abandon_job raises
AbandonmentDateUnknownError when a deal has neither
- last_submission_date now flows through the trigger message and request
- the injected clock is dropped: nothing reads now() any more
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 08:51:39 +00:00
Daniel Roth
0d69d628e8
A deal crossing into abandonment builds an abandon_job message 🟩
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 15:54:24 +00:00
Daniel Roth
aaa8c9763f
A deal crossing into abandonment builds an abandon_job message 🟥
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 15:53:47 +00:00
Daniel Roth
70fb6d5735
Repair the Abri trigger-builder import after its move into HubspotDealDiffer
...
The move in 3934e2d3 left the trigger-builder test and local smoke script
importing the deleted etl.hubspot.abri_flow_triggers module; point them at
HubspotDealDiffer.check_abri_triggers_and_construct_message so they collect
and run again.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 15:52:55 +00:00
Daniel Roth
c0e444fccb
abri_api not abri
2026-07-07 14:40:33 +00:00
Daniel Roth
04b32b1515
minor refactor
2026-07-07 13:21:01 +00:00
Daniel Roth
7b6c7e1168
remove bad import
2026-07-07 13:19:03 +00:00
Daniel Roth
252a146cc3
remove silly comment
2026-07-07 13:17:24 +00:00
Daniel Roth
3934e2d359
move trigger check to HubspotDealDiffer
2026-07-07 13:15:40 +00:00
Daniel Roth
d9b441962f
Name the Abri trigger builder for its None-or-message contract 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 13:02:25 +00:00
Daniel Roth
c016c8b754
Extract _trigger_abri_lambda for consistency with the other scraper triggers 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 12:58:48 +00:00
Daniel Roth
a3985389ab
The deal row names the job number client_booking_reference, matching HubSpot and the schema 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 12:43:40 +00:00
Daniel Roth
481c01098d
Real Abri portal deals fire the job-logging trigger 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 11:46:33 +00:00
Daniel Roth
eaedd9a63d
Real Abri portal deals fire the job-logging trigger 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 11:44:51 +00:00
Daniel Roth
8847d06d68
A first confirmed survey date on an Abri deal reaches the abri queue 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:19:01 +00:00
Daniel Roth
d70853bfd2
The scraper sends fired Abri flows to the abri queue on each deal change 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:16:13 +00:00
Daniel Roth
28b4a8927f
A scrape that fires Abri triggers builds one message naming the fired flows 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:13:48 +00:00
Daniel Roth
2e72f32d52
A scrape that fires Abri triggers builds one message naming the fired flows 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:12:41 +00:00
Daniel Roth
359516fa5f
The deal upsert lands client_booking_reference in the job_no column 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:10:29 +00:00
Daniel Roth
62d9bbf147
The deal upsert lands client_booking_reference in the job_no column 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:08:17 +00:00
Daniel Roth
0cd4efbf83
A client_booking_reference change triggers a deal database update 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:05:20 +00:00
Daniel Roth
faac50eca4
A client_booking_reference change triggers a deal database update 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:04:54 +00:00
Daniel Roth
8fd808ffd9
HubSpot deal-contacts transport lives under infrastructure like the other API clients 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 14:01:47 +00:00
Daniel Roth
b96aceaf7b
HubSpot calls share one retry policy behind a single guarded entry point 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:42:58 +00:00
Daniel Roth
8d9fb0ade4
Transient HubSpot failures are retried under the shared rate-limit policy 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:38:20 +00:00
Daniel Roth
e3894b0309
HubSpot failures surface without the response body that echoes tenant PII 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:34:33 +00:00
Daniel Roth
76d0b4bac9
Abri tenancy signatory becomes an associated HubSpot deal contact 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:24:47 +00:00
Daniel Roth
78fcba45e5
Abri tenancy signatory becomes an associated HubSpot deal contact 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:22:52 +00:00
Daniel Roth
021e7c15bb
Abri job amendment trigger is named after the OpenHousing job it amends 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 16:26:15 +00:00
Daniel Roth
ff868156d1
Abri job logging trigger is named after the DomnaRelay route it fires 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 15:26:41 +00:00
Daniel Roth
1a5368571f
add typehint
2026-07-03 10:46:24 +00:00
Daniel Roth
f4f915cfb7
Abri deal abandonment names its attempt threshold 🟪
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:19:06 +00:00
Daniel Roth
18989252f4
Deal differ detects number of attempts changes for db update 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:17:51 +00:00
Daniel Roth
c00ae894ee
Deal differ detects number of attempts changes for db update 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:14:22 +00:00
Daniel Roth
58ce855e0b
Abri deal abandonment fires only when the deal newly becomes abandoned 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:13:58 +00:00
Daniel Roth
9559f23741
Abri deal abandonment fires only when the deal newly becomes abandoned 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:12:59 +00:00
Daniel Roth
6de0da869e
Abri deal abandonment requires a negative outcome 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:11:14 +00:00
Daniel Roth
41d62ce2b2
Abri deal abandonment requires a negative outcome 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:10:26 +00:00
Daniel Roth
88093eb7cd
Abri deal abandonment requires at least three parseable attempts 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:10:03 +00:00
Daniel Roth
af85e0ed2b
Abri deal abandonment requires at least three parseable attempts 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:07:38 +00:00
Daniel Roth
79423f594c
Abri deal abandonment ignores deals that are not Abri condition deals 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:06:53 +00:00
Daniel Roth
33848a76fe
Abri deal abandonment ignores deals that are not Abri condition deals 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:04:45 +00:00
Daniel Roth
262f22764a
Abri deal abandonment triggers after three attempts with a negative outcome 🟩
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:03:57 +00:00
Daniel Roth
aca507cc47
Abri deal abandonment triggers after three attempts with a negative outcome 🟥
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:03:42 +00:00
Daniel Roth
05ca0bb280
move static method below non-statics
2026-07-03 08:33:10 +00:00