---
name: pattern-schema
description: Design schemas.tsx with Input/Output types for patterns
user-invocable: false
---
Use `Skill("ct")` for ct CLI documentation when running commands.
# Schema Design Phase
## Goal
Create `schemas.tsx` with all data types and Input/Output types BEFORE any pattern code.
## Read First
- `docs/common/concepts/types-and-schemas/default.md`
- `docs/common/concepts/types-and-schemas/writable.md`
- `docs/common/concepts/pattern.md` (Input/Output section)
## Rules
1. **ALWAYS use `pattern()`** - Never use single-type `pattern()`. Single-type patterns cannot be tested via `.send()`.
2. Every editable field needs `Writable<>` in Input type (for write access)
3. **Output types never use `Writable<>`** - they reflect returned data shape
4. Fields that could be undefined initially: use `Default`
5. Actions in Output type: `Stream` (enables testing and linking)
6. Sub-patterns need `[NAME]: string` and `[UI]: VNode` in Output type
## Template
```tsx
import { Default, NAME, Stream, UI, VNode, Writable } from "commontools";
// ============ DATA TYPES ============
export interface Item {
name: Default;
done: Default;
}
// ============ PATTERN INPUT/OUTPUT ============
export interface ItemInput {
item: Writable; // Writable in Input = pattern will modify
}
export interface ItemOutput {
[NAME]: string; // Required for sub-patterns
[UI]: VNode; // Required for sub-patterns
item: Item; // No Writable in Output
toggle: Stream; // Actions as Stream
}
```
## Done When
- All data types defined with correct Writable/Default wrapping
- All Input/Output types defined for each sub-pattern
- No TypeScript errors: `deno task ct check schemas.tsx --no-run`