Skip to main content

CODITECT Database Schema

Version: 2.0.0 Generated: January 5, 2026 Database: PostgreSQL 16 (Cloud SQL) ORM: Django 5.2.9 with django-multitenant Total Models: 82 across 15 apps


Table of Contents

  1. Overview
  2. Entity Relationship Summary
  3. Core Domain
  4. Business Domain
  5. Operational Domain
  6. Reference Data Domain
  7. Multi-Tenant Architecture
  8. Migration Status
  9. Index Reference

Schema Reference

Data Structure

field_name:
type: string
required: true
description: Field description
example: "example_value"

API Reference

Endpoint Overview

MethodEndpointDescription
GET/api/v1/resourceList resources
POST/api/v1/resourceCreate resource
PUT/api/v1/resource/:idUpdate resource
DELETE/api/v1/resource/:idDelete resource

Overview

AppModelsStatusADR Reference
tenants4OperationalCore Multi-tenant
users2Operational-
organizations4OperationalADR-047
licenses3OperationalADR-017
subscriptions3OperationalADR-014
billing8OperationalADR-014
workstations7OperationalADR-005
repositories6OperationalADR-006
container_sessions2OperationalADR-055
context5OperationalADR-052, ADR-053
issues5Operational-
workflows17OperationalWF-107 to WF-119
reference_data6OperationalISO 3166, 4217
permissions1OperationalRBAC
commerce4OperationalADR-014
Total82100%-

Entity Relationship Summary

┌─────────────────────────────────────────────────────────────────────────────┐
│ CODITECT DATA MODEL (82 Models) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ CORE IDENTITY BUSINESS LAYER │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Tenant │◄───────────────────│ Subscription │ │
│ └────┬─────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ User │◄──►│ Team │ │ Invoice │ │ Payment │ │
│ └────┬─────┘ └────┬─────┘ └──────────────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ License │ │ Project │ │ Workstation │ │ Repository │ │
│ └────┬─────┘ └──────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Session │◄───────────────────│ContainerSess │ │
│ └──────────┘ └──────────────┘ │
│ │
│ OPERATIONAL LAYER REFERENCE DATA │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Context │ │ Issue │ │ Country │ │ Currency │ │
│ │ Message │ │ Track │ │ State │ │ Timezone │ │
│ └──────────┘ └──────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

Core Domain

tenants

Multi-tenant isolation layer. All tenant-scoped models reference Tenant.

tenants.Tenant

Root entity for multi-tenant architecture.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Tenant identifier
nameVARCHAR(255)NOT NULLOrganization name
slugVARCHAR(100)UNIQUE, NOT NULLURL-safe identifier
emailVARCHAR(254)UNIQUE, NOT NULLPrimary contact email
is_activeBOOLEANDEFAULT TRUEAccount status
trial_ends_atTIMESTAMPNULLTrial expiration
settingsJSONBDEFAULT {}Tenant-specific settings
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: tenants Indexes:

  • tenants_slug_idx on (slug)
  • tenants_email_idx on (email)
  • tenants_is_active_idx on (is_active)

tenants.Team

Team groupings within a tenant.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Team ID
tenant_idUUIDFK → tenants.id, CASCADETenant
nameVARCHAR(255)NOT NULLTeam name
descriptionTEXTDEFAULT ''Team description
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: teams Constraints:

  • unique_team_name_per_tenant UNIQUE (tenant_id, name)

tenants.TeamMembership

User membership in teams.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Membership ID
tenant_idUUIDFK → tenants.id, CASCADETenant
team_idUUIDTenantFK → teams.id, CASCADETeam
user_idUUIDTenantFK → users.id, CASCADEUser
roleVARCHAR(20)DEFAULT 'member'Role in team
joined_atTIMESTAMPDEFAULT NOW()Join timestamp

Table: team_memberships Constraints:

  • unique_team_user_membership UNIQUE (team_id, user_id)

tenants.Project

Projects within a tenant with soft delete.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Project ID
tenant_idUUIDFK → tenants.id, CASCADETenant
nameVARCHAR(255)NOT NULLProject name
descriptionTEXTDEFAULT ''Description
metadataJSONBDEFAULT {}Custom metadata
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp
deleted_atTIMESTAMPNULLSoft delete timestamp

Table: projects Indexes:

  • idx_projects_tenant_active on (tenant_id, created_at DESC) WHERE deleted_at IS NULL Constraints:
  • unique_project_name_per_tenant UNIQUE (tenant_id, name) WHERE deleted_at IS NULL

users

User identity and tenant membership.

users.User

Extends AbstractUser with multi-tenant support.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4User identifier
emailVARCHAR(254)UNIQUE, NOT NULLUser email
first_nameVARCHAR(150)First name
last_nameVARCHAR(150)Last name
passwordVARCHAR(128)Hashed password
is_verifiedBOOLEANDEFAULT FALSEEmail verified
is_activeBOOLEANDEFAULT TRUEAccount active
is_staffBOOLEANDEFAULT FALSEStaff access
is_superuserBOOLEANDEFAULT FALSESuperuser access
phoneVARCHAR(20)NULLPhone number
avatar_urlVARCHAR(500)NULLProfile image URL
two_factor_enabledBOOLEANDEFAULT FALSE2FA status
two_factor_secretVARCHAR(32)NULLTOTP secret (encrypted)
last_loginTIMESTAMPNULLLast login time
date_joinedTIMESTAMPAUTORegistration time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: users Indexes:

  • users_email_idx on (email)
  • users_is_active_idx on (is_active)

users.TenantMembership

User membership across multiple tenants.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Membership ID
user_idUUIDFK → users.id, CASCADEUser
tenant_idUUIDFK → tenants.id, CASCADETenant
roleVARCHAR(20)CHECK IN ('owner', 'admin', 'member', 'viewer')Role level
is_defaultBOOLEANDEFAULT FALSEDefault tenant for user
joined_atTIMESTAMPDEFAULT NOW()Join timestamp
revoked_atTIMESTAMPNULLRevocation timestamp

Table: tenant_memberships Indexes:

  • idx_membership_user_tenant on (user_id, tenant_id)
  • idx_membership_active on (tenant_id, role) WHERE revoked_at IS NULL Constraints:
  • unique_user_tenant_membership UNIQUE (user_id, tenant_id)

organizations

ADR-047 organizational hierarchy (Platform → Organization → LegalEntity → OperatingUnit).

organizations.Platform

Platform-level organization (e.g., AZ1.AI).

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Platform ID
nameVARCHAR(255)NOT NULLPlatform name
slugVARCHAR(100)UNIQUE, NOT NULLURL slug
domainVARCHAR(255)UNIQUE, NULLCustom domain
settingsJSONBDEFAULT {}Platform settings
is_activeBOOLEANDEFAULT TRUEActive status
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: platforms


organizations.Organization

Top-level organization within platform.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Organization ID
tenant_idUUIDFK → tenants.id, CASCADETenant
platform_idUUIDFK → platforms.id, CASCADEParent platform
nameVARCHAR(255)NOT NULLOrganization name
slugVARCHAR(100)NOT NULLURL slug
typeVARCHAR(50)CHECK IN ('enterprise', 'agency', 'startup', 'individual')Org type
settingsJSONBDEFAULT {}Organization settings
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: organizations Constraints:

  • unique_org_slug_per_platform UNIQUE (platform_id, slug)

organizations.LegalEntity

Legal entities within organization (for billing/contracts).

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Entity ID
tenant_idUUIDFK → tenants.id, CASCADETenant
organization_idUUIDTenantFK → organizations.id, CASCADEParent org
nameVARCHAR(255)NOT NULLLegal name
tax_idVARCHAR(50)NULLTax identifier
country_codeCHAR(2)NOT NULLISO 3166-1 country
billing_emailVARCHAR(254)NOT NULLBilling contact
billing_addressJSONBDEFAULT {}Address JSON
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: legal_entities


organizations.OperatingUnit

Operating units within legal entities.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Unit ID
tenant_idUUIDFK → tenants.id, CASCADETenant
legal_entity_idUUIDTenantFK → legal_entities.id, CASCADEParent entity
nameVARCHAR(255)NOT NULLUnit name
cost_centerVARCHAR(50)NULLCost center code
settingsJSONBDEFAULT {}Unit settings
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: operating_units


licenses

License management with Docker registry support (ADR-017).

licenses.License

Software license assignments.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4License ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idUUIDTenantFK → users.id, CASCADELicense owner
license_keyVARCHAR(50)UNIQUE, NOT NULLLicense key
license_typeVARCHAR(20)CHECK IN ('trial', 'pro', 'team', 'enterprise')License tier
max_seatsINTEGERDEFAULT 1Concurrent seat limit
statusVARCHAR(20)CHECK IN ('active', 'expired', 'revoked', 'suspended')Status
expires_atTIMESTAMPNULLExpiration date
metadataJSONBDEFAULT {}Additional metadata
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: licenses Indexes:

  • idx_licenses_tenant_status on (tenant_id, status) WHERE status = 'active'
  • idx_licenses_license_key on (license_key)
  • idx_licenses_user_id on (user_id)

licenses.Session

Active license sessions (with heartbeat TTL).

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Session ID
tenant_idUUIDFK → tenants.id, CASCADETenant
license_idUUIDTenantFK → licenses.id, CASCADEParent license
hardware_idVARCHAR(64)NOT NULLDevice fingerprint
device_nameVARCHAR(255)NULLFriendly device name
ip_addressINETNULLClient IP
started_atTIMESTAMPDEFAULT NOW()Session start
last_heartbeatTIMESTAMPAUTOLast heartbeat
expires_atTIMESTAMPNOT NULLTTL expiration (6 min)
is_activeBOOLEANDEFAULT TRUEActive status

Table: license_sessions Indexes:

  • idx_sessions_license_active on (license_id) WHERE is_active = TRUE
  • idx_sessions_hardware_id on (hardware_id)
  • idx_sessions_expires_at on (expires_at)

licenses.DockerPullToken (ADR-017)

Short-lived Docker registry pull tokens.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Token ID
tenant_idUUIDFK → tenants.id, CASCADETenant
license_idUUIDTenantFK → licenses.id, CASCADEParent license
token_hashVARCHAR(64)UNIQUE, NOT NULLSHA-256 hash of token
repositoryVARCHAR(255)NOT NULLTarget repository path
permissionsJSONBDEFAULT ['pull']Allowed actions
issued_atTIMESTAMPDEFAULT NOW()Issue time
expires_atTIMESTAMPNOT NULLExpiration (default 1 hour)
revoked_atTIMESTAMPNULLRevocation time
last_used_atTIMESTAMPNULLLast use time
use_countINTEGERDEFAULT 0Pull count
client_ipINETNULLRequesting IP
user_agentVARCHAR(500)NULLClient user agent

Table: docker_pull_tokens Indexes:

  • idx_docker_token_hash on (token_hash)
  • idx_docker_token_license on (license_id)
  • idx_docker_token_expires on (expires_at) WHERE revoked_at IS NULL

Business Domain

subscriptions

Stripe subscription management.

subscriptions.Subscription

Stripe subscription records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Subscription ID
tenant_idUUIDFK → tenants.id, CASCADETenant
stripe_subscription_idVARCHAR(255)UNIQUE, NOT NULLStripe sub ID
stripe_customer_idVARCHAR(255)NOT NULLStripe customer
statusVARCHAR(20)CHECK IN ('active', 'past_due', 'canceled', 'incomplete', 'trialing', 'unpaid')Status
tierVARCHAR(20)CHECK IN ('free', 'pro', 'team', 'enterprise')Tier
max_workstationsINTEGERDEFAULT 1Workstation limit
max_usersINTEGERDEFAULT 1User limit
max_storage_gbINTEGERDEFAULT 10Storage limit
current_period_startTIMESTAMPNOT NULLPeriod start
current_period_endTIMESTAMPNOT NULLPeriod end
canceled_atTIMESTAMPNULLCancellation time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: subscriptions Indexes:

  • idx_subscriptions_stripe_id on (stripe_subscription_id)
  • idx_subscriptions_period on (current_period_end) WHERE status = 'active'

subscriptions.Invoice

Stripe invoice records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Invoice ID
tenant_idUUIDFK → tenants.id, CASCADETenant
subscription_idUUIDTenantFK → subscriptions.id, CASCADESubscription
stripe_invoice_idVARCHAR(255)UNIQUE, NOT NULLStripe invoice ID
amount_centsINTEGERNOT NULLInvoice amount
currencyVARCHAR(3)DEFAULT 'usd'Currency
statusVARCHAR(20)CHECK IN ('draft', 'open', 'paid', 'void', 'uncollectible')Status
descriptionTEXTDEFAULT ''Description
invoice_pdf_urlVARCHAR(500)NULLPDF download
hosted_invoice_urlVARCHAR(500)NULLHosted invoice
paid_atTIMESTAMPNULLPayment time
created_atTIMESTAMPAUTOCreation timestamp

Table: invoices Indexes:

  • idx_invoices_subscription on (subscription_id)
  • idx_invoices_stripe_id on (stripe_invoice_id)

subscriptions.UsageMetric

Usage tracking for metered billing.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Metric ID
tenant_idUUIDFK → tenants.id, CASCADETenant
metric_typeVARCHAR(50)NOT NULLMetric name
current_valueBIGINTDEFAULT 0Current usage
limit_valueBIGINTNULLUsage limit
period_startTIMESTAMPNOT NULLPeriod start
period_endTIMESTAMPNOT NULLPeriod end
recorded_atTIMESTAMPAUTORecording time
created_atTIMESTAMPAUTOCreation timestamp

Table: usage_metrics Indexes:

  • idx_usage_tenant_type on (tenant_id, metric_type)
  • idx_usage_period_end on (period_end) Constraints:
  • unique_metric_per_period UNIQUE (tenant_id, metric_type, period_start)

billing

Comprehensive billing system (ADR-014).

billing.BillingCustomer

Stripe customer records with billing info.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Customer ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idUUIDTenantFK → users.id, CASCADEUser
stripe_customer_idVARCHAR(255)UNIQUE, NOT NULLStripe customer ID
emailVARCHAR(254)NOT NULLBilling email
nameVARCHAR(255)NULLCustomer name
phoneVARCHAR(20)NULLPhone number
default_payment_method_idVARCHAR(255)NULLDefault payment method
currencyVARCHAR(3)DEFAULT 'usd'Preferred currency
tax_exemptVARCHAR(20)DEFAULT 'none'Tax exemption status
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: billing_customers


billing.BillingDocument

Invoices, credit notes, receipts.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Document ID
tenant_idUUIDFK → tenants.id, CASCADETenant
customer_idUUIDTenantFK → billing_customers.id, CASCADECustomer
document_typeVARCHAR(20)CHECK IN ('invoice', 'credit_note', 'receipt', 'quote')Type
document_numberVARCHAR(50)UNIQUE, NOT NULLDocument number
statusVARCHAR(20)NOT NULLDocument status
subtotal_centsINTEGERDEFAULT 0Subtotal
tax_centsINTEGERDEFAULT 0Tax amount
total_centsINTEGERDEFAULT 0Total amount
currencyVARCHAR(3)DEFAULT 'usd'Currency
due_dateDATENULLDue date
paid_atTIMESTAMPNULLPayment time
voided_atTIMESTAMPNULLVoid time
notesTEXTDEFAULT ''Notes
metadataJSONBDEFAULT {}Custom metadata
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: billing_documents


billing.CompanyProfile

Company billing profiles.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Profile ID
tenant_idUUIDFK → tenants.id, CASCADETenant
company_nameVARCHAR(255)NOT NULLCompany name
tax_idVARCHAR(50)NULLTax ID
address_line1VARCHAR(255)NOT NULLAddress line 1
address_line2VARCHAR(255)NULLAddress line 2
cityVARCHAR(100)NOT NULLCity
stateVARCHAR(100)NULLState/Province
postal_codeVARCHAR(20)NOT NULLPostal code
country_codeCHAR(2)NOT NULLISO 3166-1 country
phoneVARCHAR(20)NULLPhone
emailVARCHAR(254)NOT NULLContact email
logo_urlVARCHAR(500)NULLCompany logo
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: company_profiles


billing.Credit

Account credits for billing.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Credit ID
tenant_idUUIDFK → tenants.id, CASCADETenant
customer_idUUIDTenantFK → billing_customers.id, CASCADECustomer
amount_centsINTEGERNOT NULLCredit amount
currencyVARCHAR(3)DEFAULT 'usd'Currency
reasonVARCHAR(255)NOT NULLCredit reason
expires_atTIMESTAMPNULLExpiration
used_centsINTEGERDEFAULT 0Amount used
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: billing_credits


billing.DocumentAttachment

Attachments for billing documents.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Attachment ID
tenant_idUUIDFK → tenants.id, CASCADETenant
document_idUUIDTenantFK → billing_documents.id, CASCADEDocument
filenameVARCHAR(255)NOT NULLFile name
file_urlVARCHAR(500)NOT NULLFile URL
file_sizeINTEGERNOT NULLSize in bytes
mime_typeVARCHAR(100)NOT NULLMIME type
created_atTIMESTAMPAUTOCreation timestamp

Table: document_attachments


billing.EmailLog

Billing email audit log.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Log ID
tenant_idUUIDFK → tenants.id, CASCADETenant
document_idUUIDTenantFK → billing_documents.id, SET NULLDocument
recipient_emailVARCHAR(254)NOT NULLRecipient
subjectVARCHAR(255)NOT NULLEmail subject
templateVARCHAR(100)NOT NULLTemplate used
statusVARCHAR(20)CHECK IN ('pending', 'sent', 'delivered', 'failed', 'bounced')Status
sent_atTIMESTAMPNULLSend time
error_messageTEXTNULLError if failed
created_atTIMESTAMPAUTOCreation timestamp

Table: billing_email_logs


billing.LineItem

Line items for billing documents.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Item ID
tenant_idUUIDFK → tenants.id, CASCADETenant
document_idUUIDTenantFK → billing_documents.id, CASCADEDocument
descriptionVARCHAR(500)NOT NULLItem description
quantityDECIMAL(10,2)DEFAULT 1Quantity
unit_price_centsINTEGERNOT NULLUnit price
amount_centsINTEGERNOT NULLTotal amount
tax_rateDECIMAL(5,2)DEFAULT 0Tax rate %
product_codeVARCHAR(50)NULLProduct code
period_startTIMESTAMPNULLService period start
period_endTIMESTAMPNULLService period end
created_atTIMESTAMPAUTOCreation timestamp

Table: billing_line_items


billing.Payment

Payment records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Payment ID
tenant_idUUIDFK → tenants.id, CASCADETenant
document_idUUIDTenantFK → billing_documents.id, CASCADEDocument
stripe_payment_intent_idVARCHAR(255)UNIQUE, NULLStripe PI
amount_centsINTEGERNOT NULLPayment amount
currencyVARCHAR(3)DEFAULT 'usd'Currency
payment_methodVARCHAR(50)NOT NULLPayment method
statusVARCHAR(20)CHECK IN ('pending', 'processing', 'succeeded', 'failed', 'refunded')Status
failure_reasonTEXTNULLFailure reason
refunded_centsINTEGERDEFAULT 0Refunded amount
paid_atTIMESTAMPNULLPayment time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: billing_payments


workstations

Cloud Workstation management (ADR-005).

workstations.Workstation

Cloud workstation instances.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Workstation ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idUUIDTenantFK → users.id, CASCADEOwner
nameVARCHAR(255)NOT NULLWorkstation name
statusVARCHAR(20)CHECK IN ('creating', 'starting', 'running', 'stopping', 'stopped', 'deleting', 'deleted', 'error')Status
machine_typeVARCHAR(50)DEFAULT 'n2-standard-4'GCP machine type
regionVARCHAR(50)DEFAULT 'us-central1'GCP region
gcp_workstation_idVARCHAR(255)UNIQUE, NULLGCP resource ID
gcp_config_nameVARCHAR(255)NULLWorkstation config
boot_disk_size_gbINTEGERDEFAULT 200Boot disk size
idle_timeout_minutesINTEGERDEFAULT 120Idle timeout
last_activity_atTIMESTAMPNULLLast activity
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: workstations


workstations.WorkstationSession

Active workstation sessions.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Session ID
tenant_idUUIDFK → tenants.id, CASCADETenant
workstation_idUUIDTenantFK → workstations.id, CASCADEWorkstation
user_idUUIDTenantFK → users.id, CASCADEUser
started_atTIMESTAMPDEFAULT NOW()Session start
ended_atTIMESTAMPNULLSession end
ip_addressINETNULLClient IP
user_agentVARCHAR(500)NULLClient user agent

Table: workstation_sessions


workstations.WorkstationConfig

Workstation configuration templates.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Config ID
tenant_idUUIDFK → tenants.id, CASCADETenant
nameVARCHAR(255)NOT NULLConfig name
machine_typeVARCHAR(50)NOT NULLDefault machine type
container_imageVARCHAR(500)NOT NULLContainer image
boot_disk_size_gbINTEGERDEFAULT 200Boot disk
idle_timeout_minutesINTEGERDEFAULT 120Idle timeout
environment_varsJSONBDEFAULT {}Environment variables
is_defaultBOOLEANDEFAULT FALSEDefault config
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: workstation_configs


workstations.WorkstationSnapshot

Workstation snapshots for backup/restore.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Snapshot ID
tenant_idUUIDFK → tenants.id, CASCADETenant
workstation_idUUIDTenantFK → workstations.id, CASCADEWorkstation
nameVARCHAR(255)NOT NULLSnapshot name
descriptionTEXTDEFAULT ''Description
gcp_snapshot_idVARCHAR(255)UNIQUE, NULLGCP snapshot ID
size_gbINTEGERNULLSnapshot size
statusVARCHAR(20)CHECK IN ('creating', 'ready', 'deleting', 'deleted', 'error')Status
created_atTIMESTAMPAUTOCreation timestamp

Table: workstation_snapshots


workstations.WorkstationEvent

Workstation lifecycle events.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Event ID
tenant_idUUIDFK → tenants.id, CASCADETenant
workstation_idUUIDTenantFK → workstations.id, CASCADEWorkstation
event_typeVARCHAR(50)NOT NULLEvent type
statusVARCHAR(20)NOT NULLStatus before/after
messageTEXTNULLEvent message
metadataJSONBDEFAULT {}Event metadata
created_atTIMESTAMPAUTOEvent time

Table: workstation_events


workstations.WorkstationPort

Port forwarding configuration.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Port ID
tenant_idUUIDFK → tenants.id, CASCADETenant
workstation_idUUIDTenantFK → workstations.id, CASCADEWorkstation
portINTEGERNOT NULLContainer port
protocolVARCHAR(10)DEFAULT 'tcp'Protocol
labelVARCHAR(100)NULLPort label
is_publicBOOLEANDEFAULT FALSEPublicly accessible
created_atTIMESTAMPAUTOCreation timestamp

Table: workstation_ports


workstations.WorkstationEnvironment

Environment variable sets.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Environment ID
tenant_idUUIDFK → tenants.id, CASCADETenant
nameVARCHAR(255)NOT NULLEnvironment name
variablesJSONBDEFAULT {}Variable map
is_secretBOOLEANDEFAULT FALSEContains secrets
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: workstation_environments


repositories

Git repository management (ADR-006).

repositories.GiteaOrganization

Gitea organization mapping.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Gitea org ID
tenant_idUUIDFK → tenants.id, CASCADETenant
gitea_idINTEGERUNIQUE, NOT NULLGitea org ID
nameVARCHAR(255)NOT NULLOrg name
gitea_usernameVARCHAR(255)UNIQUE, NOT NULLGitea username
avatar_urlVARCHAR(500)NULLAvatar URL
descriptionTEXTDEFAULT ''Description
websiteVARCHAR(500)NULLWebsite
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: gitea_organizations


repositories.Repository

Git repository records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Repository ID
tenant_idUUIDFK → tenants.id, CASCADETenant
gitea_org_idUUIDTenantFK → gitea_organizations.id, CASCADEGitea org
gitea_repo_idINTEGERUNIQUE, NOT NULLGitea repo ID
nameVARCHAR(255)NOT NULLRepository name
descriptionTEXTDEFAULT ''Description
default_branchVARCHAR(100)DEFAULT 'main'Default branch
clone_urlVARCHAR(500)NOT NULLClone URL
ssh_urlVARCHAR(500)NULLSSH URL
is_privateBOOLEANDEFAULT TRUEPrivate repo
is_mirrorBOOLEANDEFAULT FALSEIs mirror
size_kbINTEGERDEFAULT 0Size in KB
last_pushed_atTIMESTAMPNULLLast push time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: repositories


repositories.RepositoryAccessToken

Repository access tokens.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Token ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idUUIDTenantFK → users.id, CASCADEUser
repository_idUUIDTenantFK → repositories.id, SET NULLRepository (or all)
nameVARCHAR(255)NOT NULLToken name
token_hashVARCHAR(64)UNIQUE, NOT NULLSHA-256 hash
permissionsJSONBDEFAULT ['read']Allowed permissions
expires_atTIMESTAMPNULLExpiration
last_used_atTIMESTAMPNULLLast use time
created_atTIMESTAMPAUTOCreation timestamp

Table: repository_access_tokens


repositories.RepositoryMirror

Mirror configuration for external repos.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Mirror ID
tenant_idUUIDFK → tenants.id, CASCADETenant
repository_idUUIDTenantFK → repositories.id, CASCADERepository
source_urlVARCHAR(500)NOT NULLSource repository URL
sync_interval_hoursINTEGERDEFAULT 24Sync interval
last_synced_atTIMESTAMPNULLLast sync time
last_sync_statusVARCHAR(20)CHECK IN ('success', 'failed', 'syncing')Last status
last_errorTEXTNULLLast error message
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: repository_mirrors


repositories.TenantGitQuota

Git storage quotas per tenant.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Quota ID
tenant_idUUIDFK → tenants.id, CASCADE, UNIQUETenant
max_reposINTEGERDEFAULT 100Max repositories
max_storage_mbINTEGERDEFAULT 10240Max storage MB
current_reposINTEGERDEFAULT 0Current repo count
current_storage_mbINTEGERDEFAULT 0Current storage MB
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: tenant_git_quotas


repositories.RepositoryWebhook

Webhooks for repository events.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Webhook ID
tenant_idUUIDFK → tenants.id, CASCADETenant
repository_idUUIDTenantFK → repositories.id, CASCADERepository
urlVARCHAR(500)NOT NULLWebhook URL
secret_hashVARCHAR(64)NULLSecret hash
eventsJSONBDEFAULT ['push']Subscribed events
is_activeBOOLEANDEFAULT TRUEActive status
last_triggered_atTIMESTAMPNULLLast trigger time
last_response_codeINTEGERNULLLast HTTP response
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: repository_webhooks


Operational Domain

container_sessions

Multi-user container licensing (ADR-055).

container_sessions.ContainerSession

Container session for multi-user licensing.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Session ID
tenant_idUUIDFK → tenants.id, CASCADETenant
organization_idUUIDTenantFK → organizations.id, SET NULLOrganization
license_idUUIDTenantFK → licenses.id, CASCADELicense
container_idVARCHAR(255)NOT NULLContainer/Workstation ID
container_typeVARCHAR(20)CHECK IN ('docker', 'workstation', 'kubernetes')Type
container_nameVARCHAR(255)DEFAULT ''Friendly name
session_tokenUUIDUNIQUE, DEFAULT uuid4Bearer token
statusVARCHAR(20)CHECK IN ('active', 'released', 'expired', 'terminated')Status
max_usersINTEGERDEFAULT 1Max concurrent users
current_user_countINTEGERDEFAULT 0Current users
last_heartbeat_atTIMESTAMPAUTOLast heartbeat
heartbeat_countINTEGERDEFAULT 0Total heartbeats
heartbeat_interval_secondsINTEGERDEFAULT 300Expected interval
started_atTIMESTAMPAUTOSession start
released_atTIMESTAMPNULLRelease time
expired_atTIMESTAMPNULLExpiry time
ip_addressINETNULLContainer IP
hostnameVARCHAR(255)DEFAULT ''Hostname
client_versionVARCHAR(50)DEFAULT ''Client version
metadataJSONBDEFAULT {}Additional metadata
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: container_sessions Indexes:

  • idx_container_session_tenant_status on (tenant_id, status)
  • idx_container_session_license_status on (license_id, status)
  • idx_container_session_container_id on (container_id)
  • idx_container_session_token on (session_token)
  • idx_container_session_heartbeat on (last_heartbeat_at)
  • idx_container_session_status_heartbeat on (status, last_heartbeat_at) Constraints:
  • unique_active_container_session UNIQUE (license_id, container_id) WHERE status = 'active'

container_sessions.ContainerUserSession

User session within a container.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4User session ID
tenant_idUUIDFK → tenants.id, CASCADETenant (via container)
container_session_idUUIDFK → container_sessions.id, CASCADEContainer
user_idUUIDTenantFK → users.id, SET NULLUser (if authenticated)
user_tokenUUIDUNIQUE, DEFAULT uuid4User session token
external_user_idVARCHAR(255)DEFAULT ''External user ID
user_emailVARCHAR(254)DEFAULT ''User email
is_activeBOOLEANDEFAULT TRUEActive status
started_atTIMESTAMPAUTOSession start
last_activity_atTIMESTAMPAUTOLast activity
ended_atTIMESTAMPNULLSession end
ip_addressINETNULLUser IP
user_agentTEXTDEFAULT ''User agent
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: container_user_sessions Indexes:

  • idx_container_user_session_container on (container_session_id, is_active)
  • idx_container_user_session_user on (user_id, is_active)
  • idx_container_user_session_token on (user_token)
  • idx_container_user_session_activity on (last_activity_at)

context

Claude Code context sync (ADR-052, ADR-053).

context.ContextMessage

Synced context messages across devices.

ColumnTypeConstraintsDescription
idBIGINTPK, SERIALMessage ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idVARCHAR(63)NOT NULL, INDEXUser identifier
content_hashCHAR(64)NOT NULLSHA256 dedup hash
message_typeVARCHAR(50)NOT NULLMessage type
roleVARCHAR(20)NOT NULLMessage role
contentTEXTNOT NULLMessage content
session_idVARCHAR(255)NULL, INDEXSession identifier
source_device_idVARCHAR(255)NOT NULLOrigin device
sequence_numberBIGINTNOT NULLOrdering sequence
sync_cursorBIGINTUNIQUE, NULLMonotonic cursor
synced_atTIMESTAMPDEFAULT NOW()Sync timestamp
client_versionVARCHAR(50)NULLClient version
created_atTIMESTAMPAUTOCreation timestamp

Table: context_messages Indexes:

  • context_messages_tenant_cursor_idx on (tenant_id, sync_cursor)
  • context_messages_tenant_user_synced_idx on (tenant_id, user_id, synced_at)
  • context_messages_session_synced_idx on (session_id, synced_at) Constraints:
  • unique_user_content_hash UNIQUE (user_id, content_hash)

context.SyncCursor

Per-device sync position tracking.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Cursor ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idVARCHAR(63)NOT NULLUser identifier
device_idVARCHAR(255)NOT NULLDevice identifier
last_sequenceBIGINTDEFAULT 0Last synced sequence
last_synced_atTIMESTAMPDEFAULT NOW()Last sync time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: sync_cursors Constraints:

  • unique_user_device_cursor UNIQUE (user_id, device_id)

context.SyncStats

Aggregated sync statistics.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Stats ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idVARCHAR(63)NOT NULLUser identifier
total_messagesBIGINTDEFAULT 0Total messages
total_bytesBIGINTDEFAULT 0Total bytes synced
last_push_atTIMESTAMPNULLLast push time
last_pull_atTIMESTAMPNULLLast pull time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: sync_stats Constraints:

  • unique_user_sync_stats UNIQUE (user_id)

context.TaskTracking

Task execution tracking from Claude Code TodoWrite operations.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Task tracking ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idVARCHAR(63)NOT NULL, INDEXUser identifier
task_idVARCHAR(50)NOT NULL, INDEXTask identifier (e.g., A.9.1.1)
descriptionTEXTNOT NULLTask description from TodoWrite
active_formVARCHAR(255)NULLPresent continuous form
session_idVARCHAR(255)NULL, INDEXSession identifier
project_idVARCHAR(255)NULL, INDEXProject path or identifier
statusVARCHAR(20)DEFAULT 'pending', INDEXpending, in_progress, completed
outcomeVARCHAR(20)NULLsuccess, error, partial, skipped
outcome_scoreFLOATNULLQuality score (0.0-1.0)
tool_success_countINTEGERDEFAULT 0Successful tool calls
tool_error_countINTEGERDEFAULT 0Failed tool calls
user_correctionsINTEGERDEFAULT 0User interventions
started_atTIMESTAMPNULLWhen moved to in_progress
completed_atTIMESTAMPNULLWhen moved to completed
synced_atTIMESTAMPAUTO, INDEXCloud sync timestamp
updated_atTIMESTAMPAUTOLast update
content_hashVARCHAR(64)UNIQUE, INDEXSHA256 dedup hash
sync_cursorBIGINTUNIQUE, NULL, INDEXMonotonic sync cursor
client_versionVARCHAR(50)NULLClient version
hardware_idVARCHAR(255)NULLDevice fingerprint

Table: context_task_tracking Indexes:

  • context_task_tracking_tenant_cursor_idx on (tenant_id, sync_cursor)
  • context_task_tracking_tenant_user_status_idx on (tenant_id, user_id, status)
  • context_task_tracking_tenant_project_status_idx on (tenant_id, project_id, status)
  • context_task_tracking_session_synced_idx on (session_id, synced_at)
  • context_task_tracking_task_id_status_idx on (task_id, status)

context.TaskMessage

Links TaskTracking records to related ContextMessages.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Relationship ID
tenant_idUUIDFK → tenants.id, CASCADETenant
task_idUUIDTenantFK → task_tracking.id, CASCADEParent task
message_idBIGINTTenantFK → context_messages.id, CASCADERelated message
sequenceINTEGERDEFAULT 0Order within task
created_atTIMESTAMPAUTOCreation timestamp

Table: context_task_messages Indexes:

  • context_task_messages_tenant_task_idx on (tenant_id, task_id)
  • context_task_messages_tenant_message_idx on (tenant_id, message_id) Constraints:
  • unique_task_message UNIQUE (tenant_id, task_id, message_id)

issues

Issue tracking system.

issues.Issue

Issue/ticket records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Issue ID
tenant_idUUIDFK → tenants.id, CASCADETenant
project_idUUIDTenantFK → projects.id, SET NULLProject
reporter_idUUIDTenantFK → users.id, SET NULLReporter
assignee_idUUIDTenantFK → users.id, SET NULLAssignee
titleVARCHAR(500)NOT NULLIssue title
descriptionTEXTDEFAULT ''Description
issue_typeVARCHAR(20)CHECK IN ('bug', 'feature', 'task', 'improvement')Type
priorityVARCHAR(20)CHECK IN ('critical', 'high', 'medium', 'low')Priority
statusVARCHAR(20)CHECK IN ('open', 'in_progress', 'review', 'resolved', 'closed')Status
labelsJSONBDEFAULT []Labels array
due_dateDATENULLDue date
resolved_atTIMESTAMPNULLResolution time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: issues


issues.IssueComment

Comments on issues.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Comment ID
tenant_idUUIDFK → tenants.id, CASCADETenant
issue_idUUIDTenantFK → issues.id, CASCADEIssue
author_idUUIDTenantFK → users.id, SET NULLAuthor
contentTEXTNOT NULLComment content
is_internalBOOLEANDEFAULT FALSEInternal only
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: issue_comments


issues.IssueAttachment

File attachments for issues.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Attachment ID
tenant_idUUIDFK → tenants.id, CASCADETenant
issue_idUUIDTenantFK → issues.id, CASCADEIssue
uploaded_by_idUUIDTenantFK → users.id, SET NULLUploader
filenameVARCHAR(255)NOT NULLFile name
file_urlVARCHAR(500)NOT NULLFile URL
file_sizeINTEGERNOT NULLSize in bytes
mime_typeVARCHAR(100)NOT NULLMIME type
created_atTIMESTAMPAUTOCreation timestamp

Table: issue_attachments


issues.IssueNotification

Notifications for issue updates.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Notification ID
tenant_idUUIDFK → tenants.id, CASCADETenant
issue_idUUIDTenantFK → issues.id, CASCADEIssue
user_idUUIDTenantFK → users.id, CASCADERecipient
notification_typeVARCHAR(50)NOT NULLNotification type
is_readBOOLEANDEFAULT FALSERead status
read_atTIMESTAMPNULLRead time
created_atTIMESTAMPAUTOCreation timestamp

Table: issue_notifications


issues.IssueWatcher

Users watching issues.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Watcher ID
tenant_idUUIDFK → tenants.id, CASCADETenant
issue_idUUIDTenantFK → issues.id, CASCADEIssue
user_idUUIDTenantFK → users.id, CASCADEWatcher
created_atTIMESTAMPAUTOCreation timestamp

Table: issue_watchers Constraints:

  • unique_issue_watcher UNIQUE (issue_id, user_id)

workflows

Workflow implementations for WF-107 to WF-119.

workflows.WorkflowDefinition

Workflow template definitions.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Definition ID
codeVARCHAR(20)UNIQUE, NOT NULLWorkflow code (e.g., WF-107)
nameVARCHAR(255)NOT NULLWorkflow name
descriptionTEXTDEFAULT ''Description
categoryVARCHAR(50)NOT NULLCategory
stepsJSONBDEFAULT []Step definitions
triggersJSONBDEFAULT []Trigger conditions
is_activeBOOLEANDEFAULT TRUEActive status
versionINTEGERDEFAULT 1Definition version
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: workflow_definitions


workflows.WorkflowInstance

Running workflow instances.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Instance ID
tenant_idUUIDFK → tenants.id, CASCADETenant
definition_idUUIDFK → workflow_definitions.id, PROTECTDefinition
initiated_by_idUUIDTenantFK → users.id, SET NULLInitiator
statusVARCHAR(20)CHECK IN ('pending', 'running', 'paused', 'completed', 'failed', 'cancelled')Status
current_stepINTEGERDEFAULT 0Current step index
context_dataJSONBDEFAULT {}Workflow context
started_atTIMESTAMPNULLStart time
completed_atTIMESTAMPNULLCompletion time
error_messageTEXTNULLError if failed
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: workflow_instances


workflows.WorkflowStep

Step execution records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Step ID
tenant_idUUIDFK → tenants.id, CASCADETenant
instance_idUUIDTenantFK → workflow_instances.id, CASCADEInstance
step_indexINTEGERNOT NULLStep number
step_nameVARCHAR(255)NOT NULLStep name
statusVARCHAR(20)CHECK IN ('pending', 'running', 'completed', 'failed', 'skipped')Status
input_dataJSONBDEFAULT {}Step input
output_dataJSONBDEFAULT {}Step output
started_atTIMESTAMPNULLStart time
completed_atTIMESTAMPNULLCompletion time
error_messageTEXTNULLError if failed
created_atTIMESTAMPAUTOCreation timestamp

Table: workflow_steps


workflows.WorkflowApproval

Approval requests for workflow steps.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Approval ID
tenant_idUUIDFK → tenants.id, CASCADETenant
step_idUUIDTenantFK → workflow_steps.id, CASCADEStep
approver_idUUIDTenantFK → users.id, SET NULLApprover
statusVARCHAR(20)CHECK IN ('pending', 'approved', 'rejected', 'expired')Status
decision_atTIMESTAMPNULLDecision time
commentsTEXTDEFAULT ''Comments
expires_atTIMESTAMPNULLExpiration
created_atTIMESTAMPAUTOCreation timestamp

Table: workflow_approvals


workflows.WorkflowNotification

Workflow notifications.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Notification ID
tenant_idUUIDFK → tenants.id, CASCADETenant
instance_idUUIDTenantFK → workflow_instances.id, CASCADEInstance
user_idUUIDTenantFK → users.id, CASCADERecipient
notification_typeVARCHAR(50)NOT NULLType
titleVARCHAR(255)NOT NULLTitle
messageTEXTNOT NULLMessage
is_readBOOLEANDEFAULT FALSERead status
read_atTIMESTAMPNULLRead time
created_atTIMESTAMPAUTOCreation timestamp

Table: workflow_notifications


workflows.OrganizationSettings (WF-107)

Organization settings management.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Settings ID
tenant_idUUIDFK → tenants.id, CASCADETenant
organization_idUUIDTenantFK → organizations.id, CASCADEOrganization
settings_keyVARCHAR(100)NOT NULLSetting key
settings_valueJSONBNOT NULLSetting value
changed_by_idUUIDTenantFK → users.id, SET NULLChanged by
effective_atTIMESTAMPDEFAULT NOW()Effective time
created_atTIMESTAMPAUTOCreation timestamp

Table: organization_settings Constraints:

  • unique_org_setting UNIQUE (organization_id, settings_key)

workflows.TeamRoleChange (WF-108)

Team role change requests.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Change ID
tenant_idUUIDFK → tenants.id, CASCADETenant
team_idUUIDTenantFK → teams.id, CASCADETeam
user_idUUIDTenantFK → users.id, CASCADEUser
old_roleVARCHAR(50)NOT NULLPrevious role
new_roleVARCHAR(50)NOT NULLNew role
requested_by_idUUIDTenantFK → users.id, SET NULLRequester
approved_by_idUUIDTenantFK → users.id, SET NULLApprover
statusVARCHAR(20)CHECK IN ('pending', 'approved', 'rejected', 'applied')Status
reasonTEXTDEFAULT ''Reason
effective_atTIMESTAMPNULLEffective time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: team_role_changes


workflows.LicenseSeatReallocation (WF-109)

License seat reallocation tracking.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Reallocation ID
tenant_idUUIDFK → tenants.id, CASCADETenant
license_idUUIDTenantFK → licenses.id, CASCADELicense
from_user_idUUIDTenantFK → users.id, SET NULLFrom user
to_user_idUUIDTenantFK → users.id, SET NULLTo user
requested_by_idUUIDTenantFK → users.id, SET NULLRequester
statusVARCHAR(20)CHECK IN ('pending', 'approved', 'completed', 'rejected')Status
reasonTEXTDEFAULT ''Reason
completed_atTIMESTAMPNULLCompletion time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: license_seat_reallocations


workflows.ContractorAccess (WF-110)

Contractor access with expiration.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Access ID
tenant_idUUIDFK → tenants.id, CASCADETenant
user_idUUIDTenantFK → users.id, CASCADEContractor user
granted_by_idUUIDTenantFK → users.id, SET NULLGranter
access_levelVARCHAR(50)NOT NULLAccess level
project_idsJSONBDEFAULT []Accessible projects
starts_atTIMESTAMPDEFAULT NOW()Start time
expires_atTIMESTAMPNOT NULLExpiration
extended_countINTEGERDEFAULT 0Extension count
last_extended_by_idUUIDTenantFK → users.id, SET NULLLast extender
is_activeBOOLEANDEFAULT TRUEActive status
revoked_atTIMESTAMPNULLRevocation time
revoked_by_idUUIDTenantFK → users.id, SET NULLRevoker
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: contractor_access


workflows.AgencyConsolidatedBilling (WF-111)

Agency consolidated billing records.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Billing ID
tenant_idUUIDFK → tenants.id, CASCADEAgency tenant
billing_period_startDATENOT NULLPeriod start
billing_period_endDATENOT NULLPeriod end
client_tenant_idsJSONBDEFAULT []Client tenants
total_amount_centsINTEGERDEFAULT 0Total amount
currencyVARCHAR(3)DEFAULT 'usd'Currency
statusVARCHAR(20)CHECK IN ('draft', 'sent', 'paid', 'overdue')Status
invoice_numberVARCHAR(50)UNIQUE, NULLInvoice number
sent_atTIMESTAMPNULLSent time
paid_atTIMESTAMPNULLPaid time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: agency_consolidated_billing


workflows.SubscriptionDowngrade (WF-112)

Subscription downgrade requests.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Downgrade ID
tenant_idUUIDFK → tenants.id, CASCADETenant
subscription_idUUIDTenantFK → subscriptions.id, CASCADESubscription
current_tierVARCHAR(50)NOT NULLCurrent tier
target_tierVARCHAR(50)NOT NULLTarget tier
requested_by_idUUIDTenantFK → users.id, SET NULLRequester
reasonTEXTDEFAULT ''Reason
effective_dateDATENOT NULLEffective date
statusVARCHAR(20)CHECK IN ('pending', 'scheduled', 'completed', 'cancelled')Status
data_actionsJSONBDEFAULT {}Required data actions
completed_atTIMESTAMPNULLCompletion time
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: subscription_downgrades


workflows.AuditorAccess (WF-113)

Auditor access with automatic revocation.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Access ID
tenant_idUUIDFK → tenants.id, CASCADETenant
auditor_emailVARCHAR(254)NOT NULLAuditor email
auditor_nameVARCHAR(255)NOT NULLAuditor name
audit_firmVARCHAR(255)NULLAudit firm
granted_by_idUUIDTenantFK → users.id, SET NULLGranter
access_scopeJSONBDEFAULT {}Access scope
starts_atTIMESTAMPDEFAULT NOW()Start time
expires_atTIMESTAMPNOT NULLExpiration
is_activeBOOLEANDEFAULT TRUEActive status
revoked_atTIMESTAMPNULLRevocation time
revoked_by_idUUIDTenantFK → users.id, SET NULLRevoker
audit_log_urlVARCHAR(500)NULLAudit log export
created_atTIMESTAMPAUTOCreation timestamp
updated_atTIMESTAMPAUTOLast update timestamp

Table: auditor_access


workflows.WorkflowAuditLog

Comprehensive audit log for workflows.

ColumnTypeConstraintsDescription
idUUIDPK, DEFAULT uuid4Log ID
tenant_idUUIDFK → tenants.id, CASCADETenant
instance_idUUIDTenantFK → workflow_instances.id, SET NULLInstance
actionVARCHAR(100)NOT NULLAction performed
actor_idUUIDTenantFK → users.id, SET NULLActor
actor_ipINETNULLActor IP
target_typeVARCHAR(100)NULLTarget entity type
target_idUUIDNULLTarget entity ID
before_stateJSONBNULLState before
after_stateJSONBNULLState after
metadataJSONBDEFAULT {}Additional metadata
created_atTIMESTAMPAUTOEvent time

Table: workflow_audit_logs


Reference Data Domain

reference_data

ISO standard reference data (ISO 3166, 4217, E.164).

reference_data.Country

ISO 3166-1 countries.

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALCountry ID
codeCHAR(2)UNIQUE, NOT NULLISO 3166-1 alpha-2
code_alpha3CHAR(3)UNIQUE, NOT NULLISO 3166-1 alpha-3
nameVARCHAR(100)NOT NULLCountry name
numeric_codeCHAR(3)UNIQUE, NOT NULLISO 3166-1 numeric
is_activeBOOLEANDEFAULT TRUEActive status

Table: ref_countries


reference_data.State

ISO 3166-2 subdivisions.

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALState ID
country_idINTEGERFK → ref_countries.id, CASCADECountry
codeVARCHAR(6)NOT NULLISO 3166-2 code
nameVARCHAR(100)NOT NULLState/Province name
typeVARCHAR(50)NULLType (state, province, etc.)
is_activeBOOLEANDEFAULT TRUEActive status

Table: ref_states Constraints:

  • unique_state_per_country UNIQUE (country_id, code)

reference_data.City

Cities (major cities only).

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALCity ID
state_idINTEGERFK → ref_states.id, CASCADEState
nameVARCHAR(100)NOT NULLCity name
latitudeDECIMAL(9,6)NULLLatitude
longitudeDECIMAL(9,6)NULLLongitude
populationINTEGERNULLPopulation
timezoneVARCHAR(50)NULLTimezone
is_activeBOOLEANDEFAULT TRUEActive status

Table: ref_cities


reference_data.PostalCode

Postal/ZIP codes.

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALPostal code ID
country_idINTEGERFK → ref_countries.id, CASCADECountry
codeVARCHAR(20)NOT NULLPostal code
city_nameVARCHAR(100)NULLCity name
state_codeVARCHAR(10)NULLState code
latitudeDECIMAL(9,6)NULLLatitude
longitudeDECIMAL(9,6)NULLLongitude

Table: ref_postal_codes Indexes:

  • idx_postal_code_country on (country_id, code)

reference_data.Currency

ISO 4217 currencies.

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALCurrency ID
codeCHAR(3)UNIQUE, NOT NULLISO 4217 code
nameVARCHAR(100)NOT NULLCurrency name
symbolVARCHAR(10)NULLCurrency symbol
decimal_placesINTEGERDEFAULT 2Decimal places
is_activeBOOLEANDEFAULT TRUEActive status

Table: ref_currencies


reference_data.PhoneCountryCode

ITU E.164 phone country codes.

ColumnTypeConstraintsDescription
idINTEGERPK, SERIALCode ID
country_idINTEGERFK → ref_countries.id, CASCADECountry
dialing_codeVARCHAR(10)NOT NULLDialing code
trunk_prefixVARCHAR(5)NULLTrunk prefix
format_patternVARCHAR(100)NULLFormat regex

Table: ref_phone_country_codes


Multi-Tenant Architecture

All tenant-scoped models inherit from TenantModel and use:

from django_multitenant.models import TenantModel
from django_multitenant.fields import TenantForeignKey

class MyModel(TenantModel):
tenant_id = 'tenant_id'

tenant = models.ForeignKey(
'tenants.Tenant',
on_delete=models.CASCADE,
db_column='tenant_id'
)

# Use TenantForeignKey for related tenant-scoped models
related = TenantForeignKey(
OtherTenantModel,
on_delete=models.CASCADE
)

class Meta:
# Enables automatic tenant filtering
pass

# Usage with automatic filtering
from django_multitenant.utils import set_current_tenant

set_current_tenant(tenant)
MyModel.objects.all() # Automatically filtered by tenant

Key Patterns:

  1. TenantModel inheritance - All tenant-scoped models inherit from TenantModel
  2. tenant_id column - Every tenant-scoped table has tenant_id FK
  3. TenantForeignKey - Used for relationships between tenant-scoped models
  4. TenantManager - Automatic query filtering by current tenant
  5. set_current_tenant() - Context manager for tenant scope

Migration Status

AppLatest MigrationStatus
tenants0003_team_teammembershipApplied
users0004_tenantmembershipApplied
organizations0002_platform_organization_hierarchyApplied
licenses0005_dockerpulltokenApplied
subscriptions0003_usagemetricApplied
billing0004_billing_email_logApplied
workstations0006_workstation_environmentApplied
repositories0005_repository_webhookApplied
container_sessions0001_initialApplied
context0004_tasktracking_taskmessageApplied
issues0003_issue_notification_watcherApplied
workflows0008_auditor_accessApplied
reference_data0002_phone_country_codeApplied

Total Migrations: 45 All Applied: Yes


Index Reference

Performance-Critical Indexes

TableIndexPurpose
container_sessionsidx_container_session_status_heartbeatSession cleanup queries
context_messagesidx_context_messages_tenant_cursorSync pagination
context_task_trackingidx_task_tracking_task_statusTask status queries
licensesidx_licenses_tenant_statusActive license lookup
subscriptionsidx_subscriptions_periodBilling period queries
docker_pull_tokensidx_docker_token_hashToken validation

Composite Indexes

TableIndexColumns
tenant_membershipsidx_membership_active(tenant_id, role) WHERE revoked_at IS NULL
projectsidx_projects_tenant_active(tenant_id, created_at DESC) WHERE deleted_at IS NULL
workflow_instancesidx_workflow_tenant_status(tenant_id, status, started_at)

SQL Generation Commands

Generate SQL DDL on-demand using these commands. This keeps the documentation maintainable while providing exact SQL when needed.

Generate SQL for Specific Migration

# SQL for a single migration
python manage.py sqlmigrate licenses 0005_dockerpulltoken

# SQL for container_sessions initial migration
python manage.py sqlmigrate container_sessions 0001_initial

# SQL for context app task tracking
python manage.py sqlmigrate context 0004_tasktracking_taskmessage

Generate SQL for All Migrations in an App

# All migrations for an app (run sequentially)
for migration in $(python manage.py showmigrations licenses --plan | grep licenses | awk '{print $2}'); do
echo "-- Migration: $migration"
python manage.py sqlmigrate licenses $migration
echo ""
done

Dump Current Schema from Database

# Full schema dump (recommended for production reference)
pg_dump --schema-only --no-owner --no-privileges \
-h <host> -U <user> -d coditect_db > schema.sql

# Schema for specific tables
pg_dump --schema-only --table=container_sessions --table=container_user_sessions \
-h <host> -U <user> -d coditect_db

# Local development (using environment variables)
DATABASE_URL=$DATABASE_URL pg_dump --schema-only > schema.sql

Inspect Database Schema

# List all tables
python manage.py inspectdb | grep "class "

# Generate Django models from existing database (reverse engineering)
python manage.py inspectdb > generated_models.py

# Show table structure in psql
psql -d coditect_db -c "\d+ container_sessions"

# List all indexes
psql -d coditect_db -c "\di"

# List foreign keys for a table
psql -d coditect_db -c "
SELECT
tc.constraint_name,
kcu.column_name,
ccu.table_name AS foreign_table,
ccu.column_name AS foreign_column
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY'
AND tc.table_name = 'container_sessions';
"

Quick Reference Commands

TaskCommand
Show migration SQLpython manage.py sqlmigrate <app> <migration>
Show all migrationspython manage.py showmigrations
Check migration statuspython manage.py showmigrations --plan
Dump schemapg_dump --schema-only -d coditect_db
Table structurepsql -c "\d+ <table_name>"
List indexespsql -c "\di"
List constraintspsql -c "\d+ <table_name>"

DocumentPurpose
database-architecture.mdArchitecture overview
database-integration-guide.mdIntegration patterns
ADR-017Docker registry auth
ADR-047Org hierarchy
ADR-052Intent-aware context
ADR-053Cloud sync architecture
ADR-055Container sessions

Document Version: 2.1.0 Last Updated: January 5, 2026 Total Models: 82 across 15 apps Author: CODITECT Engineering Team