Skip to content

Data model

Every table, column, default, foreign key and check constraint below is read from the Drizzle schema. Check constraints encode methodology doctrine.

Export: configFiles.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
path PgText not null
version PgInteger not null
content PgText not null
note PgText
is_current PgBoolean not null, default false
kb_document_id PgText
created_at PgTimestamp not null, default now()

Export: flags.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
opportunity_id PgUUID not null
kind PgText not null
code PgText not null
severity PgText not null
reason PgText not null
rule_ref PgText
raised_at PgTimestamp not null, default now()
expires_at PgTimestamp
cleared_at PgTimestamp

Foreign keys:

  • opportunity_idopportunities.id

Check constraints (verbatim):

  • flags_kind_check: kind in ('rule','judgement')

  • flags_severity_check: severity in ('low','medium','high')

Export: mockCrmWrites.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
opportunity_id PgUUID
field PgText not null
old_value PgText
new_value PgText
payload PgJsonb not null, default ‘{}’::jsonb
pushed_at PgTimestamp not null, default now()

Foreign keys:

  • opportunity_idopportunities.id

Export: opportunities.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
crm_id PgText not null, unique
name PgText not null
account_name PgText not null
owner_id PgUUID not null
step PgInteger not null
p1 PgInteger generated always as (case when step in (1,2) then 30 when step in (3,4) then 60 when step in (5,6) then 90 else null end)
p2 PgInteger not null
amount PgNumeric not null
currency PgText not null, default GBP
close_date PgDateString not null
original_close_date PgDateString not null
outcome PgText
product_line PgText
competitor PgText
meddic_metrics PgText
meddic_economic_buyer PgText
meddic_decision_criteria PgText
meddic_decision_process PgText
meddic_identify_pain PgText
meddic_champion PgText
meddic_unknown PgArray not null, default ‘{}’
notes PgText
last_activity_at PgTimestamp
last_step_change_at PgTimestamp
last_p2_change_at PgTimestamp
created_at PgTimestamp not null, default now()
updated_at PgTimestamp not null, default now()

Foreign keys:

  • owner_idusers.id

Check constraints (verbatim):

  • opportunities_step_check: step between 1 and 7

  • opportunities_p2_check: p2 in (30,60,90)

  • opportunities_outcome_check: outcome is null or … in ('won','lost')

Export: proposedChanges.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
opportunity_id PgUUID not null
session_id PgUUID
field PgText not null
old_value PgText
proposed_value PgText not null
adjusted_value PgText
agent_reasoning PgText not null
rep_response PgText
rep_responded_at PgTimestamp
sponsor_verdict PgText
sponsor_note PgText
sponsor_verdict_at PgTimestamp
applied_at PgTimestamp
created_at PgTimestamp not null, default now()

Foreign keys:

  • opportunity_idopportunities.id

  • session_idsessions.id

Check constraints (verbatim):

  • proposed_changes_rep_response_check: rep_response is null or … in ('approved','adjusted','rejected')

  • proposed_changes_sponsor_verdict_check: sponsor_verdict is null or … in ('right','wrong')

Export: regressionRuns.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
config_snapshot PgJsonb not null
results PgJsonb not null
started_at PgTimestamp not null, default now()
finished_at PgTimestamp
is_known_good PgBoolean not null, default false

Export: sessions.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
opportunity_id PgUUID not null
flow PgText not null
mode PgText not null
elevenlabs_conversation_id PgText
started_at PgTimestamp not null, default now()
ended_at PgTimestamp
duration_seconds PgInteger
transcript PgJsonb
tool_calls PgJsonb
outcomes_met PgJsonb
outcomes_open PgJsonb
session_evidence PgJsonb not null, default ‘{}’::jsonb
session_outcomes PgJsonb not null, default ‘{}’::jsonb
summary PgText
eval_scores PgJsonb
ended_reason PgText
step_at_start PgInteger
p1_at_start PgInteger
p2_at_start PgInteger

Foreign keys:

  • opportunity_idopportunities.id

Check constraints (verbatim):

  • sessions_mode_check: mode in ('voice','simulation')

  • sessions_ended_reason_check: ended_reason is null or … in ('complete','time_budget','rep_ended','error')

Export: stageHistory.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
opportunity_id PgUUID not null
field PgText not null
old_value PgText
new_value PgText
step_at_change PgInteger
p1_at_change PgInteger
p2_at_change PgInteger
source PgText not null
session_id PgUUID
changed_at PgTimestamp not null, default now()

Foreign keys:

  • opportunity_idopportunities.id

  • session_idsessions.id

Check constraints (verbatim):

  • stage_history_source_check: source in ('import','session','manual','admin')

Export: users.

Column Type Constraints
id PgUUID primary, not null, default gen_random_uuid()
name PgText not null
role PgText not null
created_at PgTimestamp not null, default now()

Check constraints (verbatim):

  • users_role_check: role in ('rep','manager','operator')