Back to catalog

airtable-schema-validator

Validate Airtable People table schema and data quality before demo day. Pre-flight schema checks (fields, single-select options), post-import data quality validation (duplicates, format validation, completeness scoring). Provides actionable fix suggestions. Production-ready for FirstMark presentation.

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • Updated: 2025-11-22

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: airtable-schema-validator
description: Validate Airtable People table schema and data quality before demo day. Pre-flight schema checks (fields, single-select options), post-import data quality validation (duplicates, format validation, completeness scoring). Provides actionable fix suggestions. Production-ready for FirstMark presentation.
---

# Airtable Schema Validator

## Overview

Validate Airtable schema and data quality before demo day. **Two validation modes: pre-flight schema checks and post-import data quality verification.**

**Key features:**
- 🔍 **Schema validation:** Check tables, fields, single-select options, relationships
- ✅ **Data quality checks:** Duplicates, format validation, completeness scoring
- 🛠️ **Fix suggestions:** Actionable recommendations for schema issues
- 📊 **Detailed reporting:** CSV comparison, field-level validation, warnings vs errors
- 🚨 **Early issue detection:** Catch problems before demo day

**Use this skill when:**
- Setting up Airtable before demo day (pre-flight validation)
- After importing data to verify quality (post-import validation)
- Troubleshooting schema configuration issues
- Need to verify single-select options are configured correctly
- Want to ensure data meets quality standards

---

## Quick Start

### Pre-Flight: Schema Validation (Before Loading Data)

**Purpose:** Validate Airtable schema matches expected structure before importing data.

```bash
cd .claude/skills/airtable-schema-validator
python scripts/validate_schema.py
```

**What it checks:**
- ✅ People table exists
- ✅ Required fields present (Name)
- ✅ Optional fields present (Current Title, Current Company, LinkedIn URL, Location, Bio, etc.)
- ✅ Single-select options configured:
  - Normalized Title: CFO, CTO, CPO, CEO, CMO, COO, CRO, CDO, Exec roles
  - Source: FMGuildPage, FMLinkedIN

**With fix suggestions:**
```bash
python scripts/validate_schema.py --fix-suggestions
```

**Output example:**
```
🔍 Airtable Schema Validator
============================================================
Validating base: appeY64iIwU5CEna7
Expected tables: 1
Found tables: 11

Checking table: People

============================================================
✅ Schema validation passed!
```

---

### Post-Import: Data Quality Validation (After Loading Data)

**Purpose:** Validate data quality in People table after import to catch issues early.

```bash
cd .claude/skills/airtable-schema-validator
python scripts/validate_data.py
```

**What it checks:**

**Critical issues (will fail validation):**
- ❌ Duplicate names
- ❌ Missing required fields (Name, Added Date)
- ❌ Invalid email formats
- ❌ Invalid LinkedIn URL formats
- ❌ Invalid Normalized Title values
- ❌ Invalid Source values

**Warnings (non-critical):**
- ⚠️ Missing important fields (Title, Company, LinkedIn URL)
- ⚠️ Orphaned records (no linked roles)

**With CSV comparison:**
```bash
python scripts/validate_data.py --csv /path/to/original/csv/
```

**Save detailed report:**
```bash
python scripts/validate_data.py --csv /path/to/csv/ --report quality_report.txt --verbose
```

**Output example:**
```
🔍 Airtable Data Quality Validator
============================================================

📊 Data Quality Report - People Table
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total Records: 66
✅ Complete: 58 (88%)
⚠️  Incomplete: 8 (12%)

⚠️  WARNINGS (Non-Critical):
────────────────────────────────────────────────────────────
• Missing LinkedIn URL (3 records)
• Missing Normalized Title (5 records)

📋 CSV Comparison:
────────────────────────────────────────────────────────────
Expected (from CSV): 64 records
Found in Airtable: 66 records
✅ All CSV records found in Airtable

============================================================
✅ Data quality validation passed!
   8 records have optional fields missing
```

---

## Validation Workflows

### Complete Demo Day Pre-Check (7-8 minutes)

Run before demo to ensure everything is configured:

```bash
cd .claude/skills/airtable-schema-validator

# Step 1: Validate schema (1 minute)
python scripts/validate_schema.py --fix-suggestions

# Step 2: Validate data quality (1 minute)
python scripts/validate_data.py --csv /path/to/csv/ --verbose

# Step 3: Save quality report for reference
python scripts/validate_data.py --csv /path/to/csv/ --report quality_report.txt
```

### Quick Schema Check (1 minute)

Just check if schema is configured correctly:

```bash
python scripts/validate_schema.py
```

Look for:
- ✅ Green checkmarks = all good
- ⚠️ Yellow warnings = non-critical (optional fields missing)
- ❌ Red errors = critical issues (must fix before demo)

### Quick Data Quality Check (30 seconds)

After loading data, verify it's valid:

```bash
python scripts/validate_data.py
```

Look for:
- Total record count matches expected
- No critical errors
- Warnings are acceptable (incomplete optional fields)

---

## Schema Validation Details

### What Tables Are Checked

**Required tables (v1 minimal spec):**
1. **People** - Executive candidates
2. **Portco** - Portfolio companies
3. **Portco_Roles** - Open roles at companies
4. **Role_Specs** - Evaluation templates (CFO/CTO)
5. **Searches** - Search records (linking roles to candidates)
6. **Assessments** - AI-generated assessments

### What Fields Are Validated

**People table:**
- Required: Name, Added Date
- Optional: Title, Company, Normalized Title, Source, LinkedIn URL, Bio
- Single-select: Normalized Title (CFO/CTO/etc.), Source (FMGuildPage/etc.)

**Other tables:**
- Validates required fields exist
- Checks single-select options are configured
- Verifies linked record relationships

**For complete field reference:** See [references/field_types.md](references/field_types.md)

### Common Schema Issues

**Issue 1: Missing single-select options**
```
⚠️ Normalized Title: Missing options [CPO, CRO, COO]
```
**Fix:** Add options via Airtable UI → People table → Normalized Title column → Edit field → Edit options

**Issue 2: Table not found**
```
❌ Portco_Roles table not found
```
**Fix:** Create table via Airtable UI or use schema template

**Issue 3: Required field missing**
```
❌ People table: Missing required field 'Name'
```
**Fix:** Add field via Airtable UI (should not happen with proper setup)

---

## Data Quality Validation Details

### Critical Validation Checks

**1. Duplicate Detection**
- Checks for duplicate names in People table
- Exact match only (case-sensitive)
- Lists all duplicates found

**2. Required Fields**
- Name must be present (non-empty)
- Added Date must be set
- Fails validation if missing

**3. Format Validation**
- Email: Must match standard email format (xxx@xxx.xxx)
- LinkedIn URL: Must start with linkedin.com or www.linkedin.com
- Fails validation if invalid format

**4. Single-Select Values**
- Normalized Title: Must be in valid set (CFO, CTO, etc.)
- Source: Must be in valid set (FMGuildPage, etc.)
- Fails validation if invalid value

### Warning Checks (Non-Critical)

**1. Missing Optional Fields**
- Title, Company, LinkedIn URL recommended but not required
- Reports count of records missing these fields

**2. Orphaned Records**
- People records with no linked Portco_Roles
- Searches with no linked candidates

### CSV Comparison

When you provide `--csv /path/to/csv/`, the validator:
1. Counts records in original CSV file
2. Compares to Airtable record count
3. Reports discrepancies (missing or extra records)
4. Useful for verifying complete import

---

## Demo Day Checklist

Use this before demo to ensure everything is ready:

### Schema Checklist
- [ ] All 6 tables exist
- [ ] Normalized Title has all options (CFO, CTO, CPO, etc.)
- [ ] Source has all options (FMGuildPage, etc.)
- [ ] No schema validation errors
- [ ] Run `validate_schema.py --fix-suggestions` and address all issues

### Data Quality Checklist
- [ ] No duplicate names
- [ ] All records have Name + Added Date
- [ ] LinkedIn URLs in valid format
- [ ] No critical data quality issues
- [ ] CSV comparison shows all records loaded
- [ ] Run `validate_data.py --csv /path/to/csv/` and verify output

### Manual Spot Check
- [ ] Filter People table by Added Date = today
- [ ] Review 5-10 random records
- [ ] Verify data looks correct
- [ ] Check one record end-to-end (can you create a Screen for it?)

---

## Troubleshooting

### Schema validation fails

**Check 1: API key set correctly**
```bash
cat .env | grep AIRTABLE_API_KEY
```

**Check 2: Base ID correct**
- Open `scripts/validate_schema.py`
- Verify BASE_ID = "appeY64iIwU5CEna7" (or your base)

**Check 3: Tables exist in Airtable**
- Open Airtable base in browser
- Verify all 6 tables are present

### Data validation fails with format errors

**LinkedIn URL format:**
- Valid: `linkedin.com/in/john-doe`, `www.linkedin.com/in/john-doe`
- Invalid: `http://linkedin.com/in/john-doe` (protocol not required)

**Email format:**
- Valid: `john@example.com`
- Invalid: `john@example` (missing TLD)

### CSV comparison shows missing records

**Common causes:**
1. Duplicates were skipped during import (check loader output)
2. CSV has invalid rows that were filtered
3. Import was interrupted

**Solution:**
- Re-run loader with `--verbose` to see which records were skipped
- Check loader summary for skip reasons

---

## Configuration

### Prerequisites

**Required dependencies:**
- `pyairtable>=2.0.0` (Airtable API client)
- `python-dotenv>=1.0.0` (Environment variable management)

These are already included in the project's `pyproject.toml`.

### Environment Variables

**.env file in project root:**
```bash
AIRTABLE_API_KEY=your_api_key_here
```

### Hardcoded Values

**Base ID (in both scripts):**
```python
BASE_ID = "appeY64iIwU5CEna7"
```

**To use with different base:**
Edit BASE_ID in both `validate_schema.py` and `validate_data.py`.

---

## Success Criteria

**Schema validation:**
✅ All 6 tables exist
✅ Required fields present
✅ Single-select options configured
✅ No critical errors

**Data quality validation:**
✅ No duplicate names
✅ All records have required fields
✅ Valid email/LinkedIn formats
✅ CSV comparison matches expected count

---

## See Also

**Technical Documentation:**
- [references/schema_reference.md](references/schema_reference.md) - Complete schema exploration guide
- [references/field_types.md](references/field_types.md) - Field type catalog with validation rules
- [references/testing_guide.md](references/testing_guide.md) - Complete testing workflows
- [scripts/validate_schema.py](scripts/validate_schema.py) - Schema validation implementation
- [scripts/validate_data.py](scripts/validate_data.py) - Data quality validation implementation
- [scripts/airtable_utils.py](scripts/airtable_utils.py) - Shared API utilities

**Related Skills:**
- `airtable-csv-loader` - Load executive candidate CSVs into Airtable