📄 Auditor: Customer Promises

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:

  1. Promises found in conversations but not in promise fields — with the source ticket, date, and who said it
  2. Promise field accuracy issues — where a field says one thing but the conversation says another
  3. Conditional / unresolved items — discussed but not confirmed or declined
  4. 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