data-validation
from cosmix/loom
A curated list of agents, skills and a CLAUDE.md starter for your agentic sessions!
6 stars0 forksUpdated Jan 26, 2026
npx skills add https://github.com/cosmix/loom --skill data-validationSKILL.md
Data Validation
Overview
Data validation ensures that input data meets expected formats, types, and constraints before processing. This skill covers schema validation libraries, input sanitization, output encoding, type coercion strategies, security-focused validation (XSS, injection prevention), data pipeline validation, and comprehensive error handling.
Trigger Keywords
Use this skill when working with:
- Schema validation: JSON Schema, Zod, Pydantic, Joi, Yup, Ajv, class-validator
- Input processing: validate, validation, sanitize, sanitization, input validation, form validation
- Security validation: XSS prevention, injection prevention, escape, encode, whitelist, blacklist
- Constraints: constraint checking, invariant validation, business rules, data quality
- API validation: request validation, response validation, API contracts
- Data pipelines: Great Expectations, dbt tests, data quality checks
- ML/AI: feature validation, distribution checks, data drift detection
Agent Assignments
| Agent | Responsibility |
|---|---|
| senior-software-engineer (Opus) | Schema architecture, validation strategy design, complex validation patterns |
| software-engineer (Sonnet) | Implements validation logic, integrates schema libraries, writes validators |
| security-engineer (Opus) | XSS prevention, injection prevention, sanitization strategies, encoding |
| senior-infrastructure-engineer (Opus) | Infrastructure config validation, pipeline validation, data quality checks |
Key Concepts
JSON Schema Validation
import Ajv, { JSONSchemaType, ValidateFunction } from "ajv";
import addFormats from "ajv-formats";
// Initialize Ajv with formats
const ajv = new Ajv({
allErrors: true, // Return all errors, not just first
removeAdditional: true, // Remove properties not in schema
useDefaults: true, // Apply default values
coerceTypes: true, // Coerce types when possible
});
addFormats(ajv);
// Define schema with TypeScript type
interface CreateUserRequest {
email: string;
password: string;
name: string;
age?: number;
role: "user" | "admin" | "moderator";
preferences?: {
newsletter: boolean;
theme: "light" | "dark";
};
}
const createUserSchema: JSONSchemaType<CreateUserRequest> = {
type: "object",
properties: {
email: { type: "string", format: "email", maxLength: 255 },
password: {
type: "string",
minLength: 12,
maxLength: 128,
pattern:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$",
},
name: { type: "string", minLength: 1, maxLength: 100 },
age: { type: "integer", minimum: 13, maximum: 150, nullable: true },
role: { type: "string", enum: ["user", "admin", "moderator"] },
preferences: {
type: "object",
properties: {
newsletter: { type: "boolean", default: false },
theme: { type: "string", enum: ["light", "dark"], default: "light" },
},
required: ["newsletter", "theme"],
additionalProperties: false,
nullable: true,
},
},
required: ["email", "password", "name", "role"],
additionalProperties: false,
};
// Compile and cache validator
const validateCreateUser = ajv.compile(createUserSchema);
// Usage with error formatting
function validate<T>(
validator: ValidateFunction<T>,
data: unknown,
): { success: true; data: T } | { success: false; errors: ValidationError[] } {
if (validator(data)) {
return { success: true, data };
}
const errors: ValidationError[] = (validator.errors || []).map((err) => ({
field:
err.instancePath.replace(/^\//, "").replace(/\//g, ".") ||
err.params.missingProperty,
message: formatAjvError(err),
code: err.keyword,
}));
return { success: false, errors };
}
function formatAjvError(error: Ajv.ErrorObject): string {
switch (error.keyword) {
case "required":
return `${error.params.missingProperty} is required`;
case "minLength":
return `Must be at least ${error.params.limit} characters`;
case "maxLength":
return `Must be at most ${error.params.limit} characters`;
case "format":
return `Invalid ${error.params.format} format`;
case "enum":
return `Must be one of: ${error.params.allowedValues.join(", ")}`;
case "pattern":
return "Invalid format";
case "minimum":
return `Must be at least ${error.params.limit}`;
case "maximum":
return `Must be at most ${error.params.limit}`;
default:
return error.message || "Invalid value";
}
}
Zod Validation (TypeScript)
import { z, ZodError, ZodSchema } from "zod";
// Basic schemas
const emailSchema = z.string().email().max(255);
const passwordSchema = z
.string()
.min(12, "Password must be at least 12 characters")
.max(128)
.regex(/[a-z]/, "Password must contain a lowercase letter")
.regex(/[A-Z]/, "Password must contain an uppercas
...
Repository
cosmix/loomParent repository
Repository Stats
Stars6
Forks0