⚠️ BAD EXAMPLE - Interdependent Skill (Anti-Pattern)
WARNING: This is an ANTI-PATTERN example showing what NOT to do.
DO NOT COPY THIS STRUCTURE. See good-self-contained-skill for correct approach.
❌ VIOLATION #1: Relative Path Dependencies
## Related Documentation For setup instructions, see [../setup-skill/SKILL.md](../setup-skill/SKILL.md) For testing patterns, see: - [../../testing/pytest-patterns/](../../testing/pytest-patterns/) - [../../testing/test-utils/](../../testing/test-utils/) Database integration: [../../data/database-skill/](../../data/database-skill/)
Why This is Wrong:
- ❌ Uses relative paths (
../,../../) - ❌ Assumes hierarchical directory structure
- ❌ Breaks in flat deployment (
~/.claude/skills/) - ❌ Links break when skill deployed standalone
Correct Approach:
## Complementary Skills Consider these related skills (if deployed): - **setup-skill**: Installation and configuration patterns - **pytest-patterns**: Testing framework and fixtures - **database-skill**: Database integration patterns *Note: All skills are independently deployable.*
❌ VIOLATION #2: Missing Essential Content
## Testing This skill uses pytest for testing. **See pytest-patterns skill for all testing code.** To write tests for this framework, install pytest-patterns skill and refer to its documentation.
Why This is Wrong:
- ❌ No actual testing patterns included
- ❌ Requires user to have another skill
- ❌ Skill is incomplete without other skills
- ❌ "See other skill" instead of inlining
Correct Approach:
## Testing (Self-Contained) **Essential pytest pattern** (inlined): ```python import pytest from example_framework.testing import TestClient @pytest.fixture def client(): """Test client fixture.""" return TestClient(app) def test_home_route(client): """Test homepage.""" response = client.get("/") assert response.status_code == 200 assert response.json() == {"message": "Hello"}
Advanced fixtures (if pytest-patterns skill deployed):
- Parametrized fixtures
- Database session fixtures
- Mock fixtures
See pytest-patterns skill for comprehensive patterns.
---
## ❌ VIOLATION #3: Hard Skill Dependencies
```markdown
## Prerequisites
**Required Skills**:
1. **setup-skill** - Must be installed first
2. **database-skill** - Required for database operations
3. **pytest-patterns** - Required for testing
Install all required skills before using this skill:
```bash
claude-code skills add setup-skill database-skill pytest-patterns
This skill will not work without these dependencies.
**Why This is Wrong**:
- ❌ Lists other skills as "Required"
- ❌ Skill doesn't work standalone
- ❌ Creates deployment coupling
- ❌ Violates self-containment principle
**Correct Approach**:
```markdown
## Prerequisites
**External Dependencies**:
```bash
pip install example-framework pytest sqlalchemy
Complementary Skills
When using this skill, consider (if deployed):
- setup-skill: Advanced configuration patterns (optional)
- database-skill: ORM patterns and optimization (optional)
- pytest-patterns: Testing enhancements (optional)
This skill is fully functional independently.
---
## ❌ VIOLATION #4: Cross-Skill Imports
```python
"""
Bad example - importing from other skills.
"""
# ❌ DON'T DO THIS
from skills.database_skill import get_db_session
from skills.pytest_patterns import fixture_factory
from ..shared.utils import validate_input
# Using imported patterns
@app.route("/users")
def create_user(data):
# Requires database-skill to be installed
with get_db_session() as session:
user = User(**data)
session.add(user)
return user.to_dict()
Why This is Wrong:
- ❌ Imports from other skills
- ❌ Code won't run without other skills
- ❌ Creates runtime dependencies
- ❌ Violates Python module boundaries
Correct Approach:
""" Good example - self-contained implementation. """ from contextlib import contextmanager # ✅ Include pattern directly in this skill @contextmanager def get_db_session(): """Database session context manager (self-contained).""" db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close() @app.route("/users") def create_user(data): # Works independently with get_db_session() as session: user = User(**data) session.add(user) return user.to_dict()
❌ VIOLATION #5: Hierarchical Directory Assumptions
## Project Structure This skill is located in:
toolchains/python/frameworks/bad-example-skill/
**Navigate to parent directories for related skills**:
- `../` - Other framework skills
- `../../testing/` - Testing skills
- `../../data/` - Database skills
**All skills in `toolchains/python/frameworks/` are related to this skill.**
Why This is Wrong:
- ❌ Assumes specific directory structure
- ❌ Navigation instructions using relative paths
- ❌ Won't work in flat deployment
- ❌ Confuses deployment location with skill relationships
Correct Approach:
## Related Skills **Complementary Python Framework Skills** (informational): - **fastapi-patterns**: Web framework patterns - **django-patterns**: Full-stack framework patterns - **flask-patterns**: Micro-framework patterns **Testing Skills**: - **pytest-patterns**: Testing framework - **test-driven-development**: TDD workflow *Note: Skills are independently deployable. Directory structure may vary.*
❌ VIOLATION #6: Incomplete Examples
# Database setup # (See database-skill for complete implementation) class User(db.Model): # ... see database-skill for model definition ... pass # Testing # (See pytest-patterns for test examples) def test_user(): # ... see pytest-patterns for fixtures ... pass # Deployment # (See deployment-skill for production setup)
Why This is Wrong:
- ❌ Examples are fragments, not complete code
- ❌ "See other skill" instead of showing code
- ❌ Users can't copy-paste and run
- ❌ Skill provides no actual implementation guidance
Correct Approach:
# Complete database model (self-contained) from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): """User model - complete implementation.""" __tablename__ = "users" id = Column(Integer, primary_key=True) username = Column(String(80), unique=True, nullable=False) email = Column(String(120), unique=True, nullable=False) def to_dict(self): return { "id": self.id, "username": self.username, "email": self.email } # Complete test example (self-contained) import pytest from example_framework.testing import TestClient @pytest.fixture def client(): return TestClient(app) def test_create_user(client): """Test user creation - complete working test.""" response = client.post("/users", json={ "username": "testuser", "email": "[email protected]" }) assert response.status_code == 201 assert response.json()["username"] == "testuser" # Complete deployment example (self-contained) import os class ProductionConfig: DEBUG = False SECRET_KEY = os.getenv("SECRET_KEY") DATABASE_URL = os.getenv("DATABASE_URL") app = App(config=ProductionConfig()) # Run with: gunicorn -w 4 app:app
❌ VIOLATION #7: References Directory with Cross-Skill Paths
bad-example-skill/
├── SKILL.md
├── metadata.json
└── references/
├── testing.md # Contains: ../../pytest-patterns/
├── database.md # Contains: ../../database-skill/
└── deployment.md # Contains: ../../../universal/deployment/
references/testing.md contains:
# Testing Patterns For complete testing patterns, see: - [Pytest Patterns](../../pytest-patterns/SKILL.md) - [TDD Workflow](../../../universal/testing/test-driven-development/) Refer to those skills for all testing code.
Why This is Wrong:
- ❌ References directory has cross-skill paths
- ❌ Progressive disclosure leads outside skill
- ❌ Breaks in flat deployment
- ❌ References aren't self-contained
Correct Approach:
good-example-skill/
├── SKILL.md
├── metadata.json
└── references/
├── advanced-patterns.md # All about THIS skill
├── api-reference.md # THIS skill's API
└── examples.md # THIS skill's examples
references/advanced-patterns.md should contain:
# Advanced Testing Patterns **Advanced pytest fixtures** (this skill): ```python # Parametrized test fixture @pytest.fixture(params=["value1", "value2"]) def data_variants(request): return request.param def test_with_variants(data_variants): # Test with multiple data variants assert process(data_variants) is not None
Further enhancements (if pytest-patterns deployed):
- Fixture factories
- Custom markers
- Plugin integration
See pytest-patterns skill for comprehensive advanced patterns.
---
## ❌ VIOLATION #8: metadata.json with Skill Dependencies
```json
{
"name": "bad-example-skill",
"version": "1.0.0",
"requires": [
"setup-skill",
"database-skill",
"pytest-patterns"
],
"self_contained": false,
"dependencies": ["example-framework"],
"notes": [
"This skill requires setup-skill to be installed first",
"Must deploy with database-skill for database operations",
"Won't work without pytest-patterns for testing"
]
}
Why This is Wrong:
- ❌ Lists other skills in "requires" field
- ❌
"self_contained": false - ❌ Notes say skill won't work without others
- ❌ Creates deployment coupling
Correct Approach:
{ "name": "good-example-skill", "version": "1.0.0", "requires": [], "self_contained": true, "dependencies": ["example-framework", "pytest", "sqlalchemy"], "complementary_skills": [ "setup-skill", "database-skill", "pytest-patterns" ], "notes": [ "This skill is fully self-contained and works independently", "All essential patterns are inlined", "Complementary skills provide optional enhancements" ] }
Summary of Violations
| Violation | Example | Impact |
|---|---|---|
| Relative Paths | ../../other-skill/ | Breaks in flat deployment |
| Missing Content | "See other skill for X" | Incomplete, not self-sufficient |
| Hard Dependencies | "Requires other-skill" | Can't deploy standalone |
| Cross-Skill Imports | from skills.other import | Runtime dependency |
| Hierarchical Assumptions | "Navigate to parent dir" | Location-dependent |
| Incomplete Examples | Code fragments only | Not usable |
| References Cross-Skill | references/ has ../ | Progressive disclosure broken |
| Metadata Dependencies | "requires": ["skill"] | Deployment coupling |
How to Fix These Violations
Step 1: Remove All Relative Paths
# Find violations grep -r "\.\\./" bad-example-skill/ # Remove them - use skill names instead # ❌ [skill](../../skill/SKILL.md) # ✅ skill (if deployed)
Step 2: Inline Essential Content
# Before (wrong): ## Testing See pytest-patterns skill for all testing code. # After (correct): ## Testing (Self-Contained) **Essential pattern** (inlined): [20-50 lines of actual testing code] **Advanced patterns** (if pytest-patterns deployed): - Feature list *See pytest-patterns for comprehensive guide.*
Step 3: Remove Hard Dependencies
# Before (wrong): **Required Skills**: pytest-patterns, database-skill # After (correct): **Complementary Skills** (optional): - pytest-patterns: Testing enhancements - database-skill: ORM optimization
Step 4: Make Imports Self-Contained
# Before (wrong): from skills.database import get_db_session # After (correct): @contextmanager def get_db_session(): """Inlined pattern.""" # Implementation here
Step 5: Update metadata.json
// Before (wrong): { "requires": ["other-skill"], "self_contained": false } // After (correct): { "requires": [], "self_contained": true, "complementary_skills": ["other-skill"] }
Verification
After fixing, verify self-containment:
# Should return empty (no violations) grep -r "\.\\./" skill-name/ grep -r "from skills\." skill-name/ grep -i "requires.*skill" skill-name/SKILL.md # Isolation test cp -r skill-name /tmp/skill-test/ cd /tmp/skill-test/skill-name cat SKILL.md # Should be complete and useful # Metadata check cat metadata.json | jq '.requires' # Should be [] or external packages only
See Good Example Instead
DO NOT USE THIS EXAMPLE AS A TEMPLATE
Instead, see:
- good-self-contained-skill: Correct template
- SKILL_SELF_CONTAINMENT_STANDARD.md: Complete standard
Remember: This example shows what NOT to do. Always ensure your skills are self-contained!