- pgSchema "mesh" with 4 tables isolating the peer mesh domain - Enums: visibility, transport, tier, role - audit_log is metadata-only (E2E encryption enforced at broker/client) - Cascade on mesh delete, soft-delete via archivedAt/revokedAt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.1 KiB
5.1 KiB
TCS Quick Start
Build a compiler in hours, not weeks.
Prerequisites
- Node.js 18+
- pnpm
- Anthropic API key
1. Define Your Triangle (5 min)
Pick 3 representations of the same semantic content:
Example: Form Builder
├── Visual: Form UI mockup/description
├── Structured: JSON Schema
└── Compact: FormDSL
2. Write Initial Spec (15 min)
# FormDSL Spec v0.1
## Syntax
form "name"
? field_id "Label" type [validation]
! message "text"
-> next_field
end
## Types
Tx = text, Em = email, Ph = phone, Nm = number
## Example
form "contact"
? name "Your name" Tx [required]
? email "Email" Em [required]
! thanks "Thank you!"
end
3. Create Sample Generator (10 min)
// tcs/generate.ts
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
export async function generateTriangle(prompt: string) {
const [visual, structured, dsl] = await Promise.all([
client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2000,
messages: [{ role: 'user', content: `Describe this form visually: ${prompt}` }]
}),
client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2000,
messages: [{ role: 'user', content: `Generate JSON Schema for: ${prompt}` }]
}),
client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2000,
system: `You write FormDSL. Spec: [paste spec here]`,
messages: [{ role: 'user', content: prompt }]
}),
]);
return { visual, structured, dsl };
}
4. Create Triangulator (10 min)
// tcs/triangulate.ts
export async function triangulate(sample: Triangle) {
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2000,
messages: [{
role: 'user',
content: `Compare these 3 representations. Are they semantically equivalent?
VISUAL:
${sample.visual}
JSON SCHEMA:
${JSON.stringify(sample.structured, null, 2)}
DSL:
${sample.dsl}
Return JSON: { equivalent: boolean, disagreements: string[], specGaps: string[] }`
}]
});
return JSON.parse(response.content[0].text);
}
5. Run TCS Loop (iterate)
// tcs/iterate.ts
async function tcsIteration(spec: string, sampleCount = 10) {
// Generate samples
const prompts = await generatePrompts(sampleCount);
const samples = await Promise.all(prompts.map(generateTriangle));
// Triangulate
const results = await Promise.all(samples.map(triangulate));
// Collect findings
const findings = results
.filter(r => !r.equivalent)
.flatMap(r => r.specGaps);
// Evolve spec if needed
if (findings.length > 0) {
spec = await evolveSpec(spec, findings);
}
// Build/update compiler
await buildCompiler(spec);
// Test
const testResults = await runTests(samples.filter((_, i) => results[i].equivalent));
return { spec, passRate: testResults.passRate, findings };
}
// Main loop
let spec = readFileSync('spec.md', 'utf-8');
while (true) {
const result = await tcsIteration(spec);
spec = result.spec;
if (result.passRate === 1 && result.findings.length === 0) {
console.log('Converged!');
break;
}
}
6. Output
After convergence:
output/
├── spec-final.md # Evolved specification
├── compiler/
│ ├── scanner.ts # Tokenizer
│ ├── parser.ts # AST builder
│ └── emitter.ts # Code generator
└── tests/
└── samples.json # Validated test cases
Tips
- Start small - 5-10 samples per iteration
- Parallelize - Generate/triangulate concurrently
- Trust disagreements - They reveal real spec gaps
- Checkpoint often - Save state every iteration
- Let it converge - Don't manually fix, let TCS find issues
Example Run
$ pnpm tcs:run --spec form-dsl.md --target 50
Iteration 1: 10 samples, 3 disagreements, 2 spec changes
Iteration 2: 10 samples, 1 disagreement, 1 spec change
Iteration 3: 10 samples, 0 disagreements, 0 spec changes
Iteration 4: 20 samples, 0 disagreements, 0 spec changes
✓ Converged at 50 samples, 4 iterations
Quality Rules (Non-Negotiable)
- No bypassing - Errors reveal spec gaps, don't suppress them
- No patches - Generalize fixes, don't add special cases
- Production code - Strict TypeScript, no TODOs, no debug code
- Redesign when stuck - Bad architecture can't be patched
// ❌ WRONG
try { parse(input) } catch { return null } // Bypassing
if (sample === 'special') { ... } // Isolated patch
const x: any = ... // Not production
// ✅ RIGHT
const result = parse(input) // Let it fail, fix root cause
handleAllCases(sample) // Generalized solution
const x: ParsedNode = ... // Strict types
Next Steps
- Read TCS-AI-METHODOLOGY.md for full theory
- Read TCS-CLAUDE-CODE.md for Claude Code execution
- Check TCS-ROADMAP.md for liquid package applications