Purpose
Reads the helpdesk ticket conversations for an event, extracts customer requests and commitments discussed in those conversations, and checks whether they are accurately reflected in the event's promise fields. Catches gaps where Sales discussed something with the client but never documented it as a promise — which means it won't appear in the Showbook.
Owner
Findings route to: Sales Manager
How to Run
python -m event_audit promises --event 1247
python -m event_audit promises --event 1247 --depth deep
What It Reads
From Odoo (x_events model)
All core event fields plus:
Promise fields (19 per-category text fields):
- x_studio_promise_audio_pa, x_studio_promise_corporate_audio, x_studio_promise_video_main, x_studio_promise_lighting_stage, x_studio_promise_lighting_decor, x_studio_promise_staging, x_studio_promise_rigging, x_studio_promise_power, x_studio_promise_backline, x_studio_promise_band, x_studio_promise_comms, x_studio_promise_imag, x_studio_promise_photobooth, x_studio_promise_streaming, x_studio_promise_tvs, x_studio_promise_playback, x_studio_promise_drape, x_studio_promise_presenter_support, x_studio_promise_mgmt
From Odoo (related models)
- helpdesk.ticket — All tickets linked to the event
- mail.message — Full conversation threads on each ticket (emails and comments), ordered by date. Up to 30 messages per ticket.
What It Checks
| Check | Depth |
|---|---|
| Promise fields populated for active scope categories | quick |
| Customer requests in ticket conversations match promise fields | standard |
| Implicit commitments from quotes or discussions captured | standard |
| Exclusions discussed are documented as exclusions | standard |
| Budget constraints reflected in scope decisions | deep |
| Scope changes discussed after initial quote captured | deep |
| Conditional items ("if needed") flagged for resolution | deep |
What Counts as a "Promise"
The auditor looks for these in ticket conversations:
- Explicit customer requests ("We need 4 wireless mics")
- Sales confirmations ("Yes, we'll provide a 12x9 screen")
- Scope items discussed and not declined
- Implied commitments from quotes referenced in conversations
- Budget constraints that limit scope
- Changes or additions discussed after the initial quote
Findings Output
Written to x_studio_audit_promises (text field on x_events).
Also creates structured records in x_audit_run and x_audit_finding. Findings are categorized as:
- Promises found in conversations but not in promise fields — with the source ticket, date, and who said it
- Promise field accuracy issues — where a field says one thing but the conversation says another
- Conditional / unresolved items — discussed but not confirmed or declined
- Notes — observations about overall promise documentation quality
Depth Levels
- Quick — Check if promise fields are populated for active scope categories
- Standard — Read conversations, match customer requests to promise fields
- Deep — Full analysis including implicit commitments, pricing implications, scope creep
Prompt
Full prompt at scripts/event_audit/prompts/promises.md. Key instructions:
- Read full conversation threads, not just the latest message
- Internal notes count — staff noting "client wants X" is a commitment to track
- Don't flag operational details (dock access, hotels) as missing promises
- Be specific about which promise field a finding belongs in
- Quote the relevant conversation text
- A clean report with no findings is valid if conversations are mostly logistical
Learnings File
scripts/event_audit/learnings/promises.md
Configuration File
scripts/event_audit/auditors/promises.yaml