
Tdd London Chicago
- 102 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
tdd-london-chicago is a Claude Code skill for ai & agent building.
About
tdd-london-chicago is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- tdd-london-chicago
- AI & Agent Building
- AI-coding skill
Tdd London Chicago by the numbers
- 102 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #4,284 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill tdd-london-chicagoAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 102 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with ai & agent building tasks.?
Helps with ai & agent building tasks.
Who is it for?
Best when you're working on ai & agent building and need structured help with tdd london chicago.
Skip if: Teams with no ai & agent building needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with ai & agent building tasks., or when tdd-london-chicago is a claude code skill for ai & agent building.
What you get
Structured output aligned to tdd-london-chicago: tdd-london-chicago, AI & Agent Building.
Files
Test-Driven Development: London & Chicago Schools
<default_to_action> When implementing TDD or choosing testing style: 1. IDENTIFY code type: domain logic → Chicago, external deps → London 2. WRITE failing test first (Red phase) 3. IMPLEMENT minimal code to pass (Green phase) 4. REFACTOR while keeping tests green (Refactor phase) 5. REPEAT cycle for next functionality
Quick Style Selection:
- Pure functions/calculations → Chicago (real objects, state verification)
- Controllers/services with deps → London (mocks, interaction verification)
- Value objects → Chicago (test final state)
- API integrations → London (mock external services)
- Mix both in practice (London for controllers, Chicago for domain)
Critical Success Factors:
- Tests drive design, not just verify it
- Make tests fail first to ensure they test something
- Write minimal code - no features beyond what's tested
</default_to_action>
Quick Reference Card
When to Use
- Starting new feature with test-first approach
- Refactoring legacy code with test coverage
- Teaching TDD practices to team
- Choosing between mocking vs real objects
TDD Cycle
| Phase | Action | Discipline |
|---|---|---|
| Red | Write failing test | Verify it fails, check message is clear |
| Green | Minimal code to pass | No extra features, don't refactor |
| Refactor | Improve structure | Keep tests passing, no new functionality |
School Comparison
| Aspect | Chicago (Classicist) | London (Mockist) |
|---|---|---|
| Collaborators | Real objects | Mocks/stubs |
| Verification | State (assert outcomes) | Interaction (assert calls) |
| Isolation | Lower (integrated) | Higher (unit only) |
| Refactoring | Easier | Harder (mocks break) |
| Design feedback | Emerges from use | Explicit from start |
Agent Coordination
qe-test-generator: Generate tests in both schoolsqe-test-implementer: Implement minimal code (Green)qe-test-refactorer: Safe refactoring (Refactor)
---
Chicago School (State-Based)
Philosophy: Test observable behavior through public API. Keep tests close to consumer usage.
// State verification - test final outcome
describe('Order', () => {
it('calculates total with tax', () => {
const order = new Order();
order.addItem(new Product('Widget', 10.00), 2);
order.addItem(new Product('Gadget', 15.00), 1);
expect(order.totalWithTax(0.10)).toBe(38.50);
});
});When Chicago Shines:
- Domain logic with clear state
- Algorithms and calculations
- Value objects (
Money,Email) - Simple collaborations
- Learning new domain
---
London School (Mock-Based)
Philosophy: Test each unit in isolation. Focus on how objects collaborate.
// Interaction verification - test method calls
describe('Order', () => {
it('delegates tax calculation', () => {
const taxCalculator = {
calculateTax: jest.fn().mockReturnValue(3.50)
};
const order = new Order(taxCalculator);
order.addItem({ price: 10 }, 2);
order.totalWithTax();
expect(taxCalculator.calculateTax).toHaveBeenCalledWith(20.00);
});
});When London Shines:
- External integrations (DB, APIs)
- Command patterns with side effects
- Complex workflows
- Slow operations (network, I/O)
---
Mixed Approach (Recommended)
// London for controller (external deps)
describe('OrderController', () => {
it('creates order and sends confirmation', async () => {
const orderService = { create: jest.fn().mockResolvedValue({ id: 123 }) };
const emailService = { send: jest.fn() };
const controller = new OrderController(orderService, emailService);
await controller.placeOrder(orderData);
expect(orderService.create).toHaveBeenCalledWith(orderData);
expect(emailService.send).toHaveBeenCalled();
});
});
// Chicago for domain logic
describe('OrderService', () => {
it('applies discount when threshold met', () => {
const service = new OrderService();
const order = service.create({ items: [...], total: 150 });
expect(order.discount).toBe(15); // 10% off > $100
});
});---
Common Pitfalls
❌ Over-Mocking (London)
// BAD - mocking everything
const product = { getName: jest.fn(), getPrice: jest.fn() };Better: Only mock external dependencies.
❌ Mocking Internals
// BAD - testing private methods
expect(order._calculateSubtotal).toHaveBeenCalled();Better: Test public behavior only.
❌ Test Pain = Design Pain
- Need many mocks? → Too many dependencies
- Hard to set up? → Constructor does too much
- Can't test without database? → Coupling issue
---
Agent-Assisted TDD
// Agent generates tests in both schools
await Task("Generate Tests", {
style: 'chicago', // or 'london'
target: 'src/domain/Order.ts',
focus: 'state-verification' // or 'collaboration-patterns'
}, "qe-test-generator");
// Agent-human ping-pong TDD
// Human writes test concept
const testIdea = "Order applies 10% discount when total > $100";
// Agent generates formal failing test (Red)
await Task("Create Failing Test", testIdea, "qe-test-generator");
// Human writes minimal code (Green)
// Agent suggests refactorings
await Task("Suggest Refactorings", { preserveTests: true }, "qe-test-refactorer");---
Agent Coordination Hints
Memory Namespace
aqe/tdd/
├── test-plan/* - TDD session plans
├── red-phase/* - Failing tests generated
├── green-phase/* - Implementation code
└── refactor-phase/* - Refactoring suggestionsFleet Coordination
const tddFleet = await FleetManager.coordinate({
workflow: 'red-green-refactor',
agents: {
testGenerator: 'qe-test-generator',
testExecutor: 'qe-test-executor',
qualityAnalyzer: 'qe-quality-analyzer'
},
mode: 'sequential'
});---
Related Skills
- agentic-quality-engineering - TDD with agent coordination
- refactoring-patterns - Refactor phase techniques
- api-testing-patterns - London school for API testing
---
Remember
Chicago: Test state, use real objects, refactor freely London: Test interactions, mock dependencies, design interfaces first Both: Write the test first, make it pass, refactor
Neither is "right." Choose based on context. Mix as needed. Goal: well-designed, tested code.
With Agents: Agents excel at generating tests, validating green phase, and suggesting refactorings. Use agents to maintain TDD discipline while humans focus on design decisions.
Gotchas
- Agent skips Red phase and writes test + implementation together — enforce "test must fail first" by running test before writing code
- London school over-mocking creates brittle tests that break on any refactor — mock at architectural boundaries, not every function
- Chicago school tests become slow as integration scope grows — keep test boundaries tight
- Agent defaults to jest.mock() for everything — prefer dependency injection for testability
- Refactor phase is where agent cuts corners most — verify no behavior changes by checking test output is identical
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentic-qe.dev/schemas/tdd-london-chicago-output.json",
"title": "TDD London & Chicago Schools Skill Output Schema",
"description": "Schema for TDD skill output with red-green-refactor cycles, test-first metrics, and approach comparison.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "tdd-london-chicago",
"description": "Must be 'tdd-london-chicago'"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"minimum": 0,
"maximum": 3
},
"output": {
"type": "object",
"required": ["summary", "tddCycles", "approach"],
"properties": {
"summary": {
"type": "string",
"minLength": 50,
"maxLength": 2000
},
"tddCycles": {
"$ref": "#/$defs/tddCycles"
},
"approach": {
"$ref": "#/$defs/tddApproach"
},
"testMetrics": {
"$ref": "#/$defs/testMetrics"
},
"codeQuality": {
"$ref": "#/$defs/codeQuality"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/finding"
},
"maxItems": 100
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 50
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
}
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"tddCycles": {
"type": "object",
"required": ["totalCycles", "completedCycles"],
"properties": {
"totalCycles": {
"type": "integer",
"minimum": 0,
"description": "Total red-green-refactor cycles"
},
"completedCycles": {
"type": "integer",
"minimum": 0,
"description": "Successfully completed cycles"
},
"redPhases": {
"type": "integer",
"minimum": 0,
"description": "Number of red phases (failing tests)"
},
"greenPhases": {
"type": "integer",
"minimum": 0,
"description": "Number of green phases (passing tests)"
},
"refactorPhases": {
"type": "integer",
"minimum": 0,
"description": "Number of refactor phases"
},
"averageCycleDuration": {
"type": "number",
"minimum": 0,
"description": "Average cycle duration in milliseconds"
},
"cycleDetails": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cycleNumber": {
"type": "integer",
"minimum": 1
},
"phase": {
"type": "string",
"enum": ["red", "green", "refactor"]
},
"duration": {
"type": "integer",
"minimum": 0
},
"testsWritten": {
"type": "integer",
"minimum": 0
},
"codeChanges": {
"type": "integer",
"minimum": 0
},
"status": {
"type": "string",
"enum": ["completed", "in-progress", "failed", "skipped"]
}
}
}
},
"testFirstRatio": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Percentage of tests written before implementation"
}
}
},
"tddApproach": {
"type": "object",
"required": ["school", "justification"],
"properties": {
"school": {
"type": "string",
"enum": ["london", "chicago", "hybrid"],
"description": "TDD school used"
},
"justification": {
"type": "string",
"maxLength": 1000,
"description": "Why this approach was chosen"
},
"londonMetrics": {
"type": "object",
"properties": {
"mockCount": {
"type": "integer",
"minimum": 0
},
"stubCount": {
"type": "integer",
"minimum": 0
},
"isolationLevel": {
"type": "string",
"enum": ["full", "partial", "minimal"]
},
"outsideInScore": {
"type": "number",
"minimum": 0,
"maximum": 100
}
}
},
"chicagoMetrics": {
"type": "object",
"properties": {
"integrationTests": {
"type": "integer",
"minimum": 0
},
"realCollaborators": {
"type": "integer",
"minimum": 0
},
"triangulation": {
"type": "boolean"
},
"insideOutScore": {
"type": "number",
"minimum": 0,
"maximum": 100
}
}
},
"comparison": {
"type": "object",
"properties": {
"testMaintainability": {
"type": "string",
"enum": ["london-better", "chicago-better", "equal"]
},
"designFeedback": {
"type": "string",
"enum": ["london-better", "chicago-better", "equal"]
},
"refactoringEase": {
"type": "string",
"enum": ["london-better", "chicago-better", "equal"]
}
}
}
}
},
"testMetrics": {
"type": "object",
"properties": {
"totalTests": {
"type": "integer",
"minimum": 0
},
"unitTests": {
"type": "integer",
"minimum": 0
},
"integrationTests": {
"type": "integer",
"minimum": 0
},
"passing": {
"type": "integer",
"minimum": 0
},
"failing": {
"type": "integer",
"minimum": 0
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"branchCoverage": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"mutationScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"testExecutionTime": {
"type": "integer",
"minimum": 0
}
}
},
"codeQuality": {
"type": "object",
"properties": {
"qualityScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"cyclomaticComplexity": {
"type": "number",
"minimum": 0
},
"linesOfCode": {
"type": "integer",
"minimum": 0
},
"testToCodeRatio": {
"type": "number",
"minimum": 0
},
"duplications": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"designPatterns": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"finding": {
"type": "object",
"required": ["id", "title", "severity", "category"],
"properties": {
"id": {
"type": "string",
"pattern": "^TDD-\\d{3,6}$"
},
"title": {
"type": "string",
"minLength": 10,
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"]
},
"category": {
"type": "string",
"enum": ["cycle", "coverage", "design", "mocking", "isolation", "refactoring"]
},
"phase": {
"type": "string",
"enum": ["red", "green", "refactor"]
},
"remediation": {
"type": "string"
}
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-\\d{3,6}$"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"effort": {
"type": "string",
"enum": ["trivial", "low", "medium", "high", "major"]
},
"school": {
"type": "string",
"enum": ["london", "chicago", "both"]
}
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": {
"type": "string",
"enum": ["test", "report", "coverage", "code"]
},
"path": {
"type": "string"
},
"format": {
"type": "string"
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": {
"type": "integer",
"minimum": 0
},
"toolsUsed": {
"type": "array",
"items": {
"type": "string"
}
},
"agentId": {
"type": "string"
},
"testFramework": {
"type": "string"
}
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": {
"type": "boolean"
},
"contentValid": {
"type": "boolean"
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": {
"type": "array",
"items": {
"type": "string"
}
},
"reward": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
}
{
"skillName": "tdd-london-chicago",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.tddCycles",
"output.approach"
],
"requiredNonEmptyFields": [],
"mustContainTerms": [
"tdd",
"test",
"red",
"green",
"refactor"
],
"mustNotContainTerms": [
"TODO",
"FIXME",
"placeholder"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
],
".output.approach.school": [
"london",
"chicago",
"hybrid"
]
}
}
Related skills
FAQ
What does tdd-london-chicago do?
tdd-london-chicago is a Claude Code skill for ai & agent building.
When should I use tdd-london-chicago?
When you need to helps with ai & agent building tasks., or when tdd-london-chicago is a claude code skill for ai & agent building.
What are the main capabilities?
tdd-london-chicago; AI & Agent Building; AI-coding skill.